Kirjoittaja Aihe: [Ratkaistu] viimeinkin: Tekstitiedostojen rakenteistaminen / soveltuva skripti  (Luettu 16844 kertaa)

nm

  • Käyttäjä
  • Viestejä: 16428
    • Profiili
Tämä toimii siis olettaen, että CR-merkkejä on vain sellaisissa kohdissa, joissa kuuluu olla rivinvaihto. Jos niitä on myös muualla, olet syvässä suossa.

Eli kuten tuossa esimerkkirivillä on keskellä riviä ^M, niin olen suossa?

Kolme mahdollista tapausta:

1.  CR-merkkejä on vain keskellä riviä, mahdollisesti satunnaisissa paikoissa. Oikeat rivinvaihdot on merkitty LF:llä tai CR+LF:llä.

Ratkaisu: poistetetaan kaikki CR-merkit. Tähän on esitetty sekä tr- että sed-komennot jo aiemmin.


2. CR-merkkejä on vain sellaisissa paikoissa, joissa kuuluu olla rivinvaihto, mutta LF saattaa puuttua.

Ratkaisu: dos2unix ja yksittäisten CR-merkkien muuntaminen LF-merkeiksi esim. tr-työkalulla, kuten esitin edellisessä viestissäni.


3. Yksittäisiä CR-merkkejä on sekä rivinvaihtojen kohdilla että keskellä riviä.

Mikään triviaali poisto tai muunnos ei pysty päättelemään, merkkaako CR rivinvaihtoa vai onko se turha. Tässä on todellinen ongelma, joka ei ehkä ole ratkaistavissa ilman heuristiikkaa tai koneoppimista. Jos tilanne on tämä, olisi todennäköisesti helpompaa lähteä aivan alusta selvittämään, mistä CR-merkit ovat dataan päätyneet.


Aiempi hexdump-listaus, jonka poistit (ja korvasit siistityllä esimerkillä jossa ei ole ainoatakaan CR-merkkiä), viittasi tapaukseen 2 tai 3. Siinä ei siis ollut CR:ää rivin keskellä vaan rivinvaihdon kohdalla:
Koodia: [Valitse]
etunimi;tero^Msukunimi;anteroUudessa esimerkissä tuo CR on vaihtunut LF:ksi:
Koodia: [Valitse]
etunimi;tero
sukunimi;antero
Jos siis datassa esiintyy sekä tällaisia tapauksia että yksittäisiä CR-merkkejä keskellä riviä vaikkapa nimen sisällä, olet pulassa.
« Viimeksi muokattu: 11.10.16 - klo:23.00 kirjoittanut nm »

JA5U

  • Käyttäjä
  • Viestejä: 463
    • Profiili
Latasin wxhexeditorin ja siinä virhekohdassa näkyy nuotti.

Taisin ajaa findillä kansioon nuo korjaukset, jonka jälkeen otin uuden hexdumpin, kun huomasin, että aiemmasta puuttui c kahva.
Koodia: [Valitse]
00000000  79 72 69 74 79 73 3b 0a  65 74 75 6e 69 6d 69 3b  |yritys;.etunimi;|
00000010  48 65 72 72 61 0d 73 75  6b 75 6e 69 6d 69 3b 4d  |Herra.sukunimi;M|
00000020  61 6a 75 72 69 0a 6c 61  68 69 6f 73 6f 69 74 65  |ajuri.lahiosoite|
00000030  3b 4b 6f 74 69 6b 61 74  75 20 34 0a              |;Kotikatu 4.|
0000003c

Jos tarkastelen tiedostoa komennolla
Koodia: [Valitse]
od -ctx1 test.txt
niin siinä näkee taas sen, että tuo yksi on \r ja loput \n.

nm

  • Käyttäjä
  • Viestejä: 16428
    • Profiili
Jos tarkastelen tiedostoa komennolla
Koodia: [Valitse]
od -ctx1 test.txt
niin siinä näkee taas sen, että tuo yksi on \r ja loput \n.

Jep, juuri niin. Ja tässä tapauksessa merkin \r (= CR = ^M = 0d) kohdalla kuuluisi olla rivinvaihto, vai mitä? Eli se pitäisi muuntaa \n:ksi (= LF = 0a).

Esiintyykö jossain muualla datassa \r kentän sisällä eli vaikkapa keskellä etunimeä? Jos ei, riittää esitetty tr-muunnos:

Koodia: [Valitse]
tr '\r' '\n' < tiedosto.txt > korjattutiedosto.txt
dos2unixilla voisi kuitenkin siistiä mahdolliset CR+LF:t ensin pois, kuten aiemmin esitin. Muuten niiden tilalle tulee kaksinkertainen rivinvaihto.
« Viimeksi muokattu: 11.10.16 - klo:23.26 kirjoittanut nm »

JA5U

  • Käyttäjä
  • Viestejä: 463
    • Profiili
No nyt  :)

Tein nm.sh "skriptin", kun en muutoin osannut tätä ajaa oikeilla parametreillä:
Koodia: [Valitse]
tr '\r' '\n' < $1 > fixit/$1

Kiitokset!

EDIT:
Siis lopullinen ratkaisu:
Koodia: [Valitse]
find . -type f -name "*.txt" -exec ./nm.sh {} \;
« Viimeksi muokattu: 12.10.16 - klo:00.53 kirjoittanut JA5U »