fix_mezoszelessegbol_csv

PostgreSQL adatbasisba szeretnek exportalni 1 fix mezoszelessegu fajlt es ha jol ertem sql script segitsegevel csak csv-t lehet az adatbasisba beolvasni.
Ezert ilyenbol:
000000 99999 NYGGBUKTA GREENLAND- STA GL GL +73483 +021567 +00030 (az oszlopok kozott neha 1, neha tobb space van)
szeretnek ilyet:
000000,99999,NYGGBUKTA GREENLAND- STA,GL,GL,+73483,+021567,+00030
es ez mar sikerult:
000000,99999,NYGGBUKTA,GREENLAND-,STA,GL,GL,+73483,+021567,+00030
igy:
sed 's/ [ ]*/,/g'

A gond az,h a fajl harmadik oszlopaban vannak tobb szavas nevek. Itt valahogy ki kene hagyni a space2comma atalakitast.

awk,perl,python??

Ugy is jo lenne, ha az input fajlt modositas nelkul tudnam beolvasni. De hogy tudom az sql scriptben meghatarozni,h hol vannak az oszlophatarok?

A segitseget elore is koszonom.

Hozzászólások

Szia!

Ha olyan fájlba mented az adatbázisodat, amelyben az oszlopok fix szélességűek, akkor használhatod az OpenOffice.org-ot is. A bemenő fájlod neve ".csv"-re végződjön, és a FileOpenDialog-ban megadhatod, hogy
#1 fix szélességűek az oszlopok,
#2 hol legyen a oszlopok határa.

Remélem, hogy működni fog nálad is.

Üdv,
Fuszenecker Róbert
hg8lhs

Szia!

Meglehet, kicsit erőltetett megoldás, de működőképes lehet. Szóval ha ismered a mezőhatárokat karakterpozíció szerint (márpedig ha fix mezőszélességről van szó, akkor ismerni kell), a

cut

paranccsal eszerint szétdarabolod, minden mezőt külön fájlba raksz, majd az így kapott állományokat a

paste

paranccsal összefűzöd. Mondjuk valahogy így:


i=0
for field in pos1-pos2 pos3-pos4 pos5-pos6 ...; do
    i=`expr ${i} + 1`
    cut -c ${field} datafile.csv > field-${i}.dat
done
paste -d "," field-*.dat > new-datafile.csv

A

posi-posj

párok tartalmazzák a mezőhatárokat. Az általam megadott kód esetében arra nyilván figyelni kell (de ezt most nem részletezem), hogy ha 9 mezőnél több van, akkor a

paste

helyes sorrendben fűzze össze őket.

man gawk:


       If the FIELDWIDTHS variable is set to a space separated list of numbers, each field  is
       expected to have fixed width, and gawk splits up the record using the specified widths.
       The value of FS is ignored.  Assigning a new value to FS overrides the  use  of  FIELD‐
       WIDTHS, and restores the default behavior.

Ha mondjuk az elso oszlopod 5, a masodik 15 char szeles, a 3. pedig 20, akkor:
FIELDWIDTHS='5 15 20'
utan az elso mezod $1 a 2. $2 lesz, stb..

Szoval az awk mar eleg erre. Persze ettol meg csinalhatod OO.o-val, perl-lel, vagy ami kezreall. Egyedul az escape-elesre kell figyelned (ha " van az egyik stringedben).
Ha csak egyszer kell megcsinalnod (es nem scriptbol akarod hivni a kesobbiekben), akkor valoszinuleg az OO.o a legbaratsagosabb.
Ha valamiert nem csv-t akarsz importalni (pl COPY paranccsal), akkor SQL parancsokat is generalhatsz, azt mashol is be tudod tolteni.
Ha nem UTF-8-ban volt az eredeti adatod, akkor iconv (vagy kulon szivhatsz vele).

--
"Digital content is not a tangible good and should not be subject to the same liability rules as toasters." - Francisco Mingorance, BSA

mindenkinek koszonom a segitseget. a shell scriptet bar befaragtam es mukodik. a perl es az awk is menni fog.
2 oknal fogva nem akarok manualisan OO.o-t v, Excet-t hasznalni:
a megoldast szeretnem megosztani masokkal is,
tanulni szeretnek es tobb nyelven tobbfele megoldas is erdekes.
learning by doing:)