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?
Peter G. schrieb: > Wie bekomm ich sowas in Linux hin? Du kannst mal https://mithrandie.github.io/csvq/ ausprobieren.
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 |
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
habs nun hinbekommen:
1 | gawk -F ',' '{n=length($4); print >> n-1".txt"}' input.csv |
an alle vielen Dank!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.