Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Perl RegExp juokseva numerointi

AkeMake [24.11.2014 19:26:14]

#

Käytän Sublime Text 2 -teksturiohjelmaa, jossa voi etsiä ja korvata tekstiä käyttäen Perl:n Regular Expression syntaksia.

lainaus:

Sublime Text uses Perl Regular Expression Syntax from the Boost library.

Tarkoitus olisi tehdä youtubesta löytyvälle videolle suomenkielinen tekstitys. Helpottaakseni omia hommiani, copypastetin youtuben videosta tarjoaman litteraatin Sublime text 2:een. Tokihan nuo automaattisesti määritellyt ajat ja tekstit on ihan mitä sattuu, mutta ovat kuitenkin suuntaa-antavia ja helpottavat käännöstyötä. Nyt olisi tarkoitus saada etsi-korvaa -toiminnolla litteraatti muutettua sellaiseen muotoon, että koneella oleva tekstitys-ohjelma tunnistaa sen.

Eli

lainaus:

06:57Tekstiä
07:01Lisää tekstiä
07:05Ja vielä tekstiä

pitäisi saada muotoon

lainaus:

1
00:06:57,000 --> 00:06:57,999
Tekstiä

2
00:07:01,000 --> 00:07:01,999
Lisää tekstiä

3
00:07:05,000 --> 00:07:05,999
Ja vielä tekstiä

Pääsen melko lähelle seuraavalla haulla

lainaus:

Etsi: ^([0-9]{2}:[0-9]{2})
Korvaa: \n\n00:\1,000 --> 00:\1,999\n

Ainoa ongelma siis on, etten osaa laittaa tuota juoksevaa numerointia alkuun. Jos rivejä olisi vaikka 1000 kappaletta, niin tuo olisi melko ikävä tehdä käsipelillä. Voiko sitä tehdä Regular Expressionilla ja jos voi, niin miten?

jalski [25.11.2014 21:27:56]

#

AkeMake kirjoitti:

Voiko sitä tehdä Regular Expressionilla ja jos voi, niin miten?

Tämän tyyppinen pieni työ hoituu helpoiten suoraan jollain ohjelmointikielellä, kuten: Python, Perl tai REXX.

Jos käsitin tehtävän kuvauksen oikein, niin alla olevan REXX-listauksen pitäisi hoitaa homma:

/* REXX */

infile = 'testi.txt'
outfile = 'out.txt'

data. = 0
data.numlines = 0
data.time1 = '00:00:00'

do while lines(infile) > 0
  data.numlines = data.numlines + 1
  if data.numlines > 1 then
    call lineout outfile,''
  data.line = linein(infile)
  data.time2 = strip(translate( data.line, '0123456789:', '0123456789:'xrange() ))
  data.time = overlay(data.time2, data.time1, 9-length(data.time2))
  data.text = substr(data.line,length(data.time2)+1,)
  call lineout outfile, data.numlines
  call lineout outfile, data.time',000-->'data.time',999'
  call lineout outfile, data.text
end

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta