Forum: PC-Programmierung Linux Datei nach Spaltenlänge aufteilen


von Peter G. (peterdergrosse)


Lesenswert?

Moin

ich möchte eine csv Datei je nach Länge der Spalte x aufteilen und in 
Unterdateien kopieren. Im folgenden Beispiel wird der Text in der 
entsprechenden Datei nach Spalte 4 unterschieden:

1,2,3,Paul,5,6    > 4.txt
a,b,c,Peter,e,f   > 5.txt
u,v,w,Tom,y,z     > 3.txt


Wie bekomm ich sowas in Linux hin?

von Michael D. (nospam2000)


Lesenswert?

Peter G. schrieb:
> Wie bekomm ich sowas in Linux hin?

Du kannst mal https://mithrandie.github.io/csvq/ ausprobieren.

von Hmmm (hmmm)


Lesenswert?

Peter G. schrieb:
> 1,2,3,Paul,5,6    > 4.txt
> a,b,c,Peter,e,f   > 5.txt
> u,v,w,Tom,y,z     > 3.txt
1
egrep "^.*,.*,.*,[^,]{3}," file.txt >3.txt
2
egrep "^.*,.*,.*,[^,]{4}," file.txt >4.txt
3
egrep "^.*,.*,.*,[^,]{5}," file.txt >5.txt

von Walter K. (walter_k488)


Lesenswert?

Peter G. schrieb:
> Moin
>
> ich möchte eine csv Datei je nach Länge der Spalte x aufteilen und in
> Unterdateien kopieren. Im folgenden Beispiel wird der Text in der
> entsprechenden Datei nach Spalte 4 unterschieden:
>
> 1,2,3,Paul,5,6    > 4.txt
> a,b,c,Peter,e,f   > 5.txt
> u,v,w,Tom,y,z     > 3.txt
>
>
> Wie bekomm ich sowas in Linux hin?

Dafür gibt es in der Unixwelt seit vier oder fünf Jahrzehnten die
regular expressions und andere feine Helferlein, wie z.B. den 
streameditor sed, der files zeilenweise abarbeitet.

Wenn Dir sed zu kryptisch erscheint, kannst Du die RegEx auch im vim 
oder sogar in libreOffice einsetzen.

Außerdem ist das halbe Internet voll von Beispielen, wie man csv Dateien 
parsen kann - und regex klug einsetzt

Und wenn dir das alles zu undurchsichtig erscheint, dann hast Du das 
auch ohne tiefer gehende Programmierkenntnisse mit Python oder Perl in 
ner knappen Stunde gelöst

: Bearbeitet durch User
von Peter G. (peterdergrosse)


Lesenswert?

habs nun hinbekommen:
1
gawk -F  ',' '{n=length($4); print >> n-1".txt"}' input.csv

an alle vielen Dank!

von Εrnst B. (ernst)


Lesenswert?

Peter G. schrieb:
> habs nun hinbekommen:

Vorsicht, das funktioniert bei "echten" CSV-Dateien nicht 100%ig, nur 
wenn du die Quelle kennst&kontrollierst.

Problem:
1
1,2,3,Paul,5,6
2
und
3
1,2,3,"Paul",5,6
sind inhaltlich eigentlich dasselbe, landen aber in verschiedenen 
Dateien.
Den Fall kriegt man im awk aber noch einigermaßen simpel abgehandelt.

Erhöhter Schwierigkeitsgrad dann:
1
1,2,3,"Mustermann, Paul",5,6
oder
1
1,2,3,"Paul Mustermann
2
Teststraße 1
3
12345 Testort",5,6

Spätestens bei den mehrzeiligen Datenfeldern im CSV freut man sich dann 
über eine entsprechende Library.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.