Arkisto: 18. Kesäkuuta 2008

[Ratkaisu] Tekstintunnistuksella tuotetun tekstitystiedoston virheiden korjaaminen

Lähtökohta

Kotihakemistossani on bin-alihakemisto ja se on määritelty komentojenhakupolkujen (PATH-muuttuja) joukkoon komentoriviprofiilissani.

Olen muuntanut kuvamuotoisen tekstityksen tekstimuotoiseksi Avidemuxilla. SRT-muotoinen tekstitystiedosto on tallennettu kotihakemistooni tiedostonimellä tekstitys.srt. Tekstitys sisältää muunnoksen jäljiltä joitain toistuvia virheitä: rivien alussa on välilyöntejä, pikku-l ja iso I-kirjain ovat paikoin sekoittuneet, joidenkin numeroiden välissä on välilyöntejä vaikka numerot ovat osa samaa lukua, ja lainausmerkin (”) tilalla on kaksi heittopilkkua (’ ’).

Ongelma
Virheitä on niin paljon, että niiden korjaaminen käsityönä Tekstieditorissa olisi liian työlästä. Haluan korjata virheet tarkoitukseen soveltuvilla komentojonoilla.
Ratkaisu

Luon seuraavassa listatut komentojonotiedostot, ja tallennan ne kotihakemistossani olevaan bin-alihakemistoon.

#!/bin/sed -f
s/^\ *//

Lataa leading_blank.sed (24 tavun komentojonotiedosto)

#!/usr/bin/gawk -f

BEGIN { FS = "" }
{
  previous = ""
  for (i = 1; i <= NF; i = i + 1) {
    if ($i ~ /I/) {
      if (previous ~ /[[:lower:]]/) {
        printf("l")
        previous = "l"
      } else if (i == 1) {
        printf("%s",$i)
        previous = $i
      } else if ((previous ~ /-/) && (i == 2)) {
        printf("%s",$i)
        previous = $i
      } else if (i < NF) {
        for (j = 1; i + j < NF; j = j + 1) {
          if ($(i+j) ~ /[[ \n]]/) {
            j = NF
            break
          } else if ($(i+j) ~ /[[:lower:]]/) {
            break
          }
        }
        if (i + j < NF) {
          printf("l")
          previous = "l"
        } else {
          printf("%s",$i)
          previous = $i
        }
      } else {
        printf("%s",$i)
        previous = $i
      }
    } else {
      printf("%s",$i)
      previous = $i
    }
  }
  printf("\n")
}

Lataa mixed_verticals.gawk (756 tavun komentojonotiedosto)

#!/bin/sed -f
s/\([[:digit:]]\) \([[:digit:]]\)/\1\2/g

Lataa blank_between_numbers.sed (56 tavun komentojonotiedosto)

#!/bin/sed -f
s/''/"/g

Lataa double_single_quotes.sed (24 tavun komentojonotiedosto)

Tämän jälkeen teen komentojonotiedostoista suoritettavia seuraavalla komennolla:

cd ~/bin && chmod +x blank_between_numbers.sed leading_blank.sed \
mixed_verticals.gawk double_single_quotes.sed

Lopuksi käytän kaikkia komentojonoja tekstitystiedostoon sen korjaamiseksi, seuraavasti:

cat ~/tekstitys.srt \
| leading_blank.sed | mixed_verticals.gawk \
| blank_between_numbers.sed | double_single_quotes.sed \
> ~/korjattu-tekstitys.txt

Tämän jälkeen kotihakemistossani oleva korjattu-tekstitys.txt -niminen tiedosto sisältää tekstityksen, jossa alkuperäisessä olleet virheet on korjattu.