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

JA5U

  • Käyttäjä
  • Viestejä: 438
    • Profiili
Moi

Nyt olis 1000 tekstitiedostoa, jotka pitäisi saada tietokantaan.

Tekstitiedostot ovat jokseenkin rakenteisessa muodossa:
-tunniste ja data samalla rivillä esim: kuvaus;lorem ipsum dolor sit amet
-osassa erotin on = ja osassa pelkkä \s
-pääsääntöisesti data on tekstiä ja numeroita ja osin pvm jne (ohjelmoinin/konekielisen käsittelyn näkökulmsta vahvasti tyypitettyjä?)
-rivien määrä per tiedosto vaihtelee
-kaikilla on kuitenkin yhteiset tunnisteet

Kerkesin jos melko paljon muokkaamaan näitä eli
-kaikilla on sama erotin ;,
-tyhjät rivit on poistettu,
-osa datasta on rakenteistettu omille riveille jne.

Voisin tietysti jatkon kannalta yhdistää käytetyt komennot yhdeksi skriptiksi, mutta kiinnoistaisi tietää, jos tällaiseen tarkoitukseen on olemassa jotain työkaluja?
Kenties ihan graafisellä käyttöliittymällä varustettuja...
Omilla avainsanoilla en löytänyt kovinkaan osuvia.
« Viimeksi muokattu: 12.10.16 - klo:00.56 kirjoittanut JA5U »

nm

  • Käyttäjä
  • Viestejä: 13028
    • Profiili
Skripteillähän tuollaiset muunnokset tehdään. Esikäsittelyn voi usein tehdä vaikka shell-skriptillä, joka kutsuu grep, sed tai awk -ohjelmia tarpeen mukaan. Tai sitten suoraan Pythonilla tai jollain muulla vastaavalla nopeaan kehitykseen soveltuvalla kielellä, jossa on tarvittavat välineet ja tietokantarajapinnat.

Graafista käyttöliittymää en itse ole tällaisissa hommissa kaivannut. Ehkä sitten, jos muunnos on automatisoitavissa vain osittain ja vaatisi tiedostokohtaista säätämistä. (Hankalia ovat esim. raporttidokkarit, joista pitäisi poimia vapaasta tekstistä asioita.)

JA5U

  • Käyttäjä
  • Viestejä: 438
    • Profiili
Em. muutokset tein tosiaan sedillä ja eikä ollut edes hirvittävän vmäistä.
Tarkemmin ottaen
Koodia: [Valitse]
find . -type f -exec sed -i 's/pois/tilalle/g' {} \;^M oli uusi juttu, mutta senkin sai korvattua, kun käytti \r...

Vissiin otan pisimmästä tiedostosta eli eniten rivejä sisältävästä tarvittavat sarakenimet kantaan varten.
Sen jälkeen voi loopata tiedostot läpi ja muodostaa niistä insert lausekkeet...kai...
« Viimeksi muokattu: 28.04.16 - klo:15.59 kirjoittanut JA5U »

JA5U

  • Käyttäjä
  • Viestejä: 438
    • Profiili
Milläs saisin nyt poistettu useamman samanlaisen mjonon samalta riviltä?
Esim.
Teksti;01.01.2001Teksti;01.01.2001Teksti;01.01.2001Teksti;01.01.2001Teksti;01.01.2001

Siten, että ensimmäinen kuitenkin säilyy...

nm

  • Käyttäjä
  • Viestejä: 13028
    • Profiili
Jotain tällaista voi kokeilla:

Koodia: [Valitse]
sed -r 's/^(.+)(\1)+$/\1/' input.txt
Vaatii, että merkkijono toistuu täsmälleen samanlaisena, eikä rivillä ole mitään muuta. Jos siellä on yksikin poikkeava merkki, riville ei tehdä mitään. Lisäksi esimerkiksi rivi aaaa muuttuu a:ksi.
« Viimeksi muokattu: 28.04.16 - klo:00.55 kirjoittanut nm »

JA5U

  • Käyttäjä
  • Viestejä: 438
    • Profiili
Jotain tällaista voi kokeilla:

Koodia: [Valitse]
sed -r 's/^(.+)(\1)+$/\1/' input.txt
Vaatii, että merkkijono toistuu täsmälleen samanlaisena, eikä rivillä ole mitään muuta. Jos siellä on yksikin poikkeava merkki, riville ei tehdä mitään. Lisäksi esimerkiksi rivi aaaa muuttuu a:ksi.

Täytyypä illalla kokeilla.

Eilen tein omia kokeliuja, mutta tuloksetta. Tuota edelläkin käytettyä '\1' kokeilin korvausarvona, mutta se aiheutti jonkin herjan.
Tuohan on käsittäkseni viittaus 'capturing groupin' eli sillä saadaan se 1. osuma talteen?
Tämäkin syntaksi on hieman erilainen kuin muissa yhteyksissä.

En saanut myöskään noita sulkumerkkejä toimimaan () - kokeilin kenoviivan kanssa ja ilman.

En tiedä, että onko joku versio juttu, mutta itselläni on 15.04 asennettuna

nm

  • Käyttäjä
  • Viestejä: 13028
    • Profiili
Eilen tein omia kokeliuja, mutta tuloksetta. Tuota edelläkin käytettyä '\1' kokeilin korvausarvona, mutta se aiheutti jonkin herjan.

Varmaan ne sulut olivat jotenkin pielessä. Sedin perustilassa ryhmittelysulut pitää tosiaan suojata kenoviivalla.

Lisäksi tässä on kätevää käyttää \{1,\}:n sijaan +:aa, jota sed tukee vain -r -parametrin kautta valittavassa laajennetussa tilassa. Tällöin myöskään sulkuja ei tarvitse suojata. Perustilassa lauseke pitäisi kirjoittaa näin:

Koodia: [Valitse]
sed 's/^\(.\{1,\}\)\(\1\)\{1,\}$/\1/' input.txt

Lisäys:
Huomasin säännöllisten lausekkeiden ahneesta sovituksesta (greedy matching) johtuvan ongelman. Jos merkkijono toistuu parillisen määrän kertoja, tämä lauseke tunnistaa sen koostuvan vain kahdesta osasta, koska peräkkäin asetettuna ne muodostavat alkuperäisen merkkijonon.

5 toistoa:
Koodia: [Valitse]
$ echo "aaaaa" |  sed -r 's/^(.+)(\1)+$/\1/'
a

6 toistoa:
Koodia: [Valitse]
$ echo "aaaaaa" |  sed -r 's/^(.+)(\1)+$/\1/'
aaa

Tätä voi olla vaikea ratkaista sedillä toistamatta operaatiota useita kertoja: esimerkiksi ajamalla komentoa silmukassa, kunnes tulos ei enää muutu syötteeseen verrattuna.

Perlillä voi käyttää non-greedy-sovitusta: (.+?)

Koodia: [Valitse]
$echo "aaaaaa" | perl -pe 's/^(.+?)(\1)+$/\1/'
a
« Viimeksi muokattu: 28.04.16 - klo:10.50 kirjoittanut nm »

JA5U

  • Käyttäjä
  • Viestejä: 438
    • Profiili
Herjaa pukkaa:
Koodia: [Valitse]
# find . -type f -name "*.txt" -exec sed -ir 's/^([a-z]+\s+[a-z]+;)(\d{2}).(\d{2}).(\d{4}) (\d{2}):(\d{2}):(\d{2})(\1)+$/\1/ig' {} \;
sed: -e expression #1, char 88: Invalid back reference

Tässä siis täsmää "Sana sana;dd.mm.yyyy hh:mm:ss".

JA5U

  • Käyttäjä
  • Viestejä: 438
    • Profiili
Kun ei se sujunut, niin kylmästi katkaisin viimeisen rivin X merkkimäärän kohdalta.
Tämä siis nappaa viimeisen rivin 36 merkkiä ja korvaa koko rivin niillä merkeillä.
Koodia: [Valitse]
find . -type f -name "*.txt" -exec sed -i -r '$ s/(.){36}/\1/ig' {} \;

nm

  • Käyttäjä
  • Viestejä: 13028
    • Profiili
Herjaa pukkaa:
Koodia: [Valitse]
# find . -type f -name "*.txt" -exec sed -ir 's/^([a-z]+\s+[a-z]+;)(\d{2}).(\d{2}).(\d{4}) (\d{2}):(\d{2}):(\d{2})(\1)+$/\1/ig' {} \;
sed: -e expression #1, char 88: Invalid back reference

Tässä siis täsmää "Sana sana;dd.mm.yyyy hh:mm:ss".

Virhe johtui tästä:

Koodia: [Valitse]
sed --help
Lainaus
-i[SUFFIX], --in-place[=SUFFIX]
                 edit files in place (makes backup if SUFFIX supplied)

Eli sed tulkitsee parametrin "-ir" parametriksi "-i", jolla on määreenä väliaikaistiedoston päätteenä käytettävä merkkijono "r". Parametri -r ei siis mene perille ja säännöllisen lausekkeen syntaksi ei kelpaa. Komento on kirjoitettava, kuten myöhemmässä skriptissäsi teit: "sed -i -r"


Ongelma 2

Sed ei tulkitse \d:tä numeroksi. Käytä sen sijaan syntaksia [0-9] tai merkkiluokkaa [[:digit:]]
Myös \s on vähän epävarma, jos skriptin pitäisi olla siirrettävissä muihin järjestelmiin. Vain GNU sed tukee sitä. [[:space:]] on laajemmin tuettu.

Perl tukee \d:tä ja \s:ää.


Ongelma 3

Skripti ei ratkaise esitettyä tehtävää. Olkoon toistuva merkkijono esimerkiksi "yks kaks;28.04.2016 10:11:22":

Koodia: [Valitse]
echo "yks kaks;28.04.2016 10:11:22yks kaks;28.04.2016 10:11:22" | sed -r 's/^([a-z]+[[:space:]]+[a-z]+;)([0-9]{2}).([0-9]{2}).([0-9]{4}) ([0-9]{2}):([0-9]{2}):([0-9]{2})(\1)+$/\1/ig'Tulos:
Koodia: [Valitse]
yks kaks;28.04.2016 10:11:22yks kaks;28.04.2016 10:11:22
Ulos saatiin syötetty merkkijono, eli lauseke ei tunnistanut toistoa. Sen sijaan skripti osaa tehdä tällaisen muunnoksen:

"yks kaks;28.04.2016 10:11:22yks kaks;" --> "yks kaks;"

Tai:

"yks kaks;28.04.2016 10:11:22yks kaks;yks kaks;yks kaks;" --> "yks kaks;"


Alkuperäinen ongelma ratkeaa tällaisella lausekkeella, jos siis halutaan speksata toistuvan merkkijonon hyväksytty sisältö tarkasti:

Koodia: [Valitse]
sed -i -r 's/^([a-z]+[[:space:]]+[a-z]+;[0-9]{2}.[0-9]{2}.[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2})(\1)+$/\1/' input.txt
Tässä on poistettu ylimääräiset sulut numerokenttien ympäriltä ja siirretty päivämäärä ja aika toistuvan ryhmän sisään.

PS. Kuten mitä tahansa ei-triviaalia koodia, säännöllisiä lausekkeita kannattaa testata aluksi yksittäisillä syötteillä sen sijaan, että ajaa koko datasetin skriptin läpi. Lausekkeita joutuu aina viilaamaan jonkin verran ja testailemaan rajatapauksia. Yleensä on helpointa vain putkittaa testattava syöte skriptille komentorivillä. Lähdetiedostojen muuttamista (sed -i) on syytä välttää kehityksen aikana, ja ehkä muutenkin.
« Viimeksi muokattu: 29.04.16 - klo:01.31 kirjoittanut nm »

JA5U

  • Käyttäjä
  • Viestejä: 438
    • Profiili

Ongelma 2

Sed ei tulkitse \d:tä numeroksi. Käytä sen sijaan syntaksia [0-9] tai merkkiluokkaa [[:digit:]]
Myös \s on vähän epävarma, jos skriptin pitäisi olla siirrettävissä muihin järjestelmiin. Vain GNU sed tukee sitä. [[:space:]] on laajemmin tuettu.

Perl tukee \d:tä ja \s:ää.

Hmh...

Ongelma 3
Alkuperäinen ongelma ratkeaa tällaisella lausekkeella, jos siis halutaan speksata toistuvan merkkijonon hyväksytty sisältö tarkasti:

Koodia: [Valitse]
sed -i -r 's/^([a-z]+[[:space:]]+[a-z]+;[0-9]{2}.[0-9]{2}.[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2})(\1)+$/\1/' input.txt
Tässä on poistettu ylimääräiset sulut numerokenttien ympäriltä ja siirretty päivämäärä ja aika toistuvan ryhmän sisään.

Näinhän se tosiaan toimii. Unohdin tarkentaa, että nuo mahdolliset toistot sisältävät eri ajan eli eivät täsmää \1.

Kuitenkin tuo viimeisen rivin muokkaus oli toimiva temppu tässä tapauksessa, kun ne olivat aina viimeisellä rivillä.
Olisi pitänyt heti alussa muokata kaikista tiedostoista tuo "Sana sana" -> "sana". Ei se hirveästi selkeytä tarvittavaa lauseketta, mutta kuitenkin...

http://www-rohan.sdsu.edu/doc/sed.html

JA5U

  • Käyttäjä
  • Viestejä: 438
    • Profiili
Nyt tarttis saada poistettu tietyiltä riveiltä ;-merkin jälkeen kaikki muut merkit paitsi numerot ja väliviiva?
esim "rivintunniste; noin. 10-15" -> "rivintunniste;10-15"

En tiedä, että onko sed tähän paras vai joku muu?

Sitten, kun tiedostot on kunnossa, niin ne pitäisi saada myös käännetty riveiltä sarakkeisiin.
Tuommosta https://sourceforge.net/projects/transpose/ ehdoteltiin jossain, mutta en saanut sitä toimimaan.

EDIT: Nyt sain toimimaan, kun löysin yhdestä ketjusta ohjeet, että kuinka sitä käytetään:
Koodia: [Valitse]
transpose -t --fsep ";" input.txt > output.txtTosin, tulokset olivat sinne päin eli tiedostosta muodostui kolmirivinen kahden sijaan, jossa on muutamia otsakkeita sikinsokin.

Toinen minkä löysin gnu datamash, mutta se taas kaatui
Koodia: [Valitse]
datamash: transpose input error: line 4 has 2 fields (previous lines had 3);
Johtuuko sitten ääkkösistä? Hieman menee iteroiden, pitääkin käyttää lisää valitsimia
Koodia: [Valitse]
--no-strict -filler 0Joka tosin kaatuu:
Koodia: [Valitse]
datamash: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted (core dumped)
« Viimeksi muokattu: 03.05.16 - klo:20.16 kirjoittanut JA5U »

nm

  • Käyttäjä
  • Viestejä: 13028
    • Profiili
Sitten, kun tiedostot on kunnossa, niin ne pitäisi saada myös käännetty riveiltä sarakkeisiin.
Tuommosta https://sourceforge.net/projects/transpose/ ehdoteltiin jossain, mutta en saanut sitä toimimaan.

EDIT: Nyt sain toimimaan, kun löysin yhdestä ketjusta ohjeet, että kuinka sitä käytetään:
Koodia: [Valitse]
transpose -t --fsep ";" input.txt > output.txtTosin, tulokset olivat sinne päin eli tiedostosta muodostui kolmirivinen kahden sijaan, jossa on muutamia otsakkeita sikinsokin.

Esiintyykö erotin ";" jokaisella rivillä kerran ja vain kerran? Muutenhan sarakkeita on eri määrä eri riveillä ja transpose varmaankin sekoaa siihen.

Kyhäsin huvikseni shell-skriptin samaan hommaan, vaikka helpommin kyllä onnistuisi jollain kehittyneemmällä kielellä.

Koodia: [Valitse]
#!/bin/sh

if [ $# -lt 1 ]; then
    echo "Transpose delimited data"
    echo ""
    echo "usage: $0 input.txt > output.txt"
    echo ""
    exit
fi

input="$1"

delimiter=";"
substitute=","

printrow() {
    outdelim=""
    echo "$1" | while IFS= read -r val; do
        echo -n "$outdelim$val"
        outdelim="$delimiter"
    done
}

# Regular expression to match two columns separated by $delimiter
matchcolumns="^\([^$delimiter]*\)$delimiter\(.*\)$"

# Pick first column
header=$(sed -e "s/$matchcolumns/\1/" "$input")

# Pick rest of the  columns. They are all treated as one combined column.
data0=$(sed -e "s/$matchcolumns/\2/" "$input")

# Substitute leftover delimiters with $substitute to avoid mismatching pairs
data=$(echo "$data0" | tr "$delimiter" "$substitute")

printrow "$header"
echo ""
printrow "$data"
echo ""


Nyt tarttis saada poistettu tietyiltä riveiltä ;-merkin jälkeen kaikki muut merkit paitsi numerot ja väliviiva?
esim "rivintunniste; noin. 10-15" -> "rivintunniste;10-15"

En tiedä, että onko sed tähän paras vai joku muu?

Taitaa mennä aika vaikeaksi pelkällä sedillä. Awk:lla onnistunee helpommin. Tässä shell+sed -ratkaisu sovellettuna yllä esitetystä:

Koodia: [Valitse]
inputfile="$1"

delimiter=";"

# Remove stuff from the second column. This expression keeps numbers 0-9 and the dash character and removes everything else.
removethis="[^0-9-]"

matchcolumns="^\([^$delimiter]*\)$delimiter\(.*\)$"

cat "$inputfile" | while IFS= read -r val; do
    header=$(echo "$val" | sed -e "s/$matchcolumns/\1/")
    data=$(echo "$val" | sed -e "s/$matchcolumns/\2/; s/$removethis//g")
    echo "$header$delimiter$data"
done

JA5U

  • Käyttäjä
  • Viestejä: 438
    • Profiili
Tästähän alkaa paisua jo aika hc ketju.
Pitääpä laittaa illalla testaten noita.

Esiintyykö erotin ";" jokaisella rivillä kerran ja vain kerran? Muutenhan sarakkeita on eri määrä eri riveillä ja transpose varmaankin sekoaa siihen.

Kyllä, valitsin tuon merkin erottimeksi siksi, että sitä ei esiintynyt tekstissä muutoin.
Eilen kävi ilmi, että ilmeisesti tuo datamash sekosi siitä syystä, että kyseisellä rivillä tunniste-arvoparilta puuttui arvo: "tunniste;".
--no-strict ilmeisesti estää sen kaatumisen, mutta sitä käyttämällä tuli taas tuo aiemmin ilmoitettu virhe, joka laukaisi myös Ubuntun oman virheilmoituksen...

Kokeilin myös vaihtaa rajoitinmerkiksi :, mutta "tulokset" olivat siitä huolimatta vastaavanlaisia.
Tuolla ;-merkillä se itseasiassa katkaisi koko komennon, jos sitä käytti ohjeiden tapaan -t; ilman hipsuja.

JA5U

  • Käyttäjä
  • Viestejä: 438
    • Profiili
Menee kyllä vähä ylihilseen nuo aiemmat skriptit.
Johtuu siitä, etten tunne tuota syntaksia, erikoismerkkejä taikka muuttujien "käsittelyä".

Loogisesti ajateltuna tässä on melko yksinkertaisesti ongelmasta kyse:
luetaan rivi,
jaetaan se kahteen osaan ;-merkin perustella,
1. osa menee 1. rivin jatkoksi ja
2. osa 2. rivin jatkoksi.

Jotenkin tätä pähkäilin ja rupesin miettimään sedittämistä siten, että suoritetaan useampi komento
Koodia: [Valitse]
sed -e '' -e ''
En kuitenkaan ymmärrä, että miten tuon ensimmäisen sed komennon tulokset saisi siirretty seuraavalle, joka taas muokkaisi tiettyä tiedostoa edellä kuvatun mukaisesti.
Tai ts. miten \1 ja \2 saisi siirrettyä eteenpäin sedille/bashille käsiteltäväksi, joka sitten suorittaisi \1 lisäyksen riville 1 ja \2 lisäyksen riville 2 tiettyyn tiedostoon?

Eli
Koodia: [Valitse]
halkaise;minut
halkaiset;minutkin
...
tulee
Koodia: [Valitse]
halkaise,halkaiset
minut,minutkin
...

Pseudo
load input
while read line
split line to array
open output
write ','+array[1] to output line 1
write ','+array[2] to output line 2
« Viimeksi muokattu: 05.05.16 - klo:16.16 kirjoittanut JA5U »

nm

  • Käyttäjä
  • Viestejä: 13028
    • Profiili
Menee kyllä vähä ylihilseen nuo aiemmat skriptit.
Johtuu siitä, etten tunne tuota syntaksia, erikoismerkkejä taikka muuttujien "käsittelyä".

Oliko skriptin käytössä tai toiminnassa jokin ongelma? Ei pitäisi olla tarvetta muokata sitä mitenkään, jos tarkoituksena on erottaa ;-merkillä erotetut kaksi saraketta ja kirjoittaa arvot ;-merkillä erotettuina kahdelle riville. Tekee saman kuin transpose, mutta pitäisi toimia lähes kaikilla kuviteltavissa olevilla syötteillä.

Loogisesti ajateltuna tässä on melko yksinkertaisesti ongelmasta kyse:
luetaan rivi,
jaetaan se kahteen osaan ;-merkin perustella,
1. osa menee 1. rivin jatkoksi ja
2. osa 2. rivin jatkoksi.

Skriptini käyttää osien erotteluun säännöllistä lauseketta "^\([^;]*\);\(.*\)$"
Ensimmäisen sarakkeen kaikki arvot saadaan siis rivinvaihdoin eroteltuna komennolla:
Koodia: [Valitse]
sed -e "s/^\([^;]*\);\(.*\)$/\1/" tiedosto.txt
Toisen sarakkeen arvot saadaan vastaavasti komennolla:
Koodia: [Valitse]
sed -e "s/^\([^;]*\);\(.*\)$/\2/" tiedosto.txt
Nämä tallennetaan muuttujiin (ensimmäinen sarake muuttujaan header ja toinen sarake muuttujaan data0. Skriptin printrow-funktio muuntaa rivinvaihdot ;-välimerkeiksi ja tulostaa rivit stdoutiin, jonka voit ohjata haluamaasi tiedostoon.

JA5U

  • Käyttäjä
  • Viestejä: 438
    • Profiili
Eipä näissä koodeissa liene vikaa, pikemminkin lukijassa.

Vkloppuna ajelin näitä ja CSVhen tuli kolme riviä.
En oikein tiedä, että mistä se johtuu, kun sama tapahtui muillakin ratkaisulla.

Jotenkin tuntuu, että tiedostoissa olisi jotain mätää, mutta ei ainakaan näytä olevan.

nm

  • Käyttäjä
  • Viestejä: 13028
    • Profiili
Eipä näissä koodeissa liene vikaa, pikemminkin lukijassa.

Vkloppuna ajelin näitä ja CSVhen tuli kolme riviä.
En oikein tiedä, että mistä se johtuu, kun sama tapahtui muillakin ratkaisulla.

Jotenkin tuntuu, että tiedostoissa olisi jotain mätää, mutta ei ainakaan näytä olevan.

Sitten tarvittaisiin esimerkki, jossa näin tapahtuu. En oikein näe, miten se olisi mahdollista, koska skripti tulostaa vain kaksi riviä, eikä riveille listattavissa sarakkeissa voi olla rivinvaihtoja (LF).

Ainut, mikä tulee mieleen on ylimääräinen CR-merkki jossain välissä, ja tekstieditorisi tulkitsee sen rivinvaihdoksi..?

JA5U

  • Käyttäjä
  • Viestejä: 438
    • Profiili
Sitten tarvittaisiin esimerkki, jossa näin tapahtuu. En oikein näe, miten se olisi mahdollista, koska skripti tulostaa vain kaksi riviä, eikä riveille listattavissa sarakkeissa voi olla rivinvaihtoja (LF).

Ainut, mikä tulee mieleen on ylimääräinen CR-merkki jossain välissä, ja tekstieditorisi tulkitsee sen rivinvaihdoksi..?

Eletäänkö eri aikavyöhykkeillä? :) Vai vaan eri vrkrytmissä...

Testaamalla testasin nyt ja totesin, että ongelmat johtuvat rivistä, jolla ei ole tunnisteelle arvoa.
Eli jostain syystä kaikki ratkaisut sekoavat, jos rivillä on pelkkä tunniste eikä arvoa:
Koodia: [Valitse]
column_name;
« Viimeksi muokattu: 10.05.16 - klo:22.15 kirjoittanut JA5U »

nm

  • Käyttäjä
  • Viestejä: 13028
    • Profiili
En onnistu toistamaan.  Edes puuttuva sarakkeen nimi ei haittaa:

input.txt:
Koodia: [Valitse]
column_1;value1
column_2;
column_3;value3
;value4
column_5;value5

Skriptin läpi ajettuna:

Koodia: [Valitse]
./tp.sh input.txt
Koodia: [Valitse]
column_1;column_2;column_3;;column_5
value1;;value3;value4;value5

Laita viestin liitteeksi tekstitiedosto, jossa vika esiintyy.
« Viimeksi muokattu: 10.05.16 - klo:23.07 kirjoittanut nm »