Hallo,
wie kopiert man in Python die Reihe 1 aus file_1.csv und Reihe 1 aus file_2.csv in file_3.csv ?
Bsp.:
file_1.csv: 1, Hase 3, Bus 5, Schnecke
file_2.csv: 4, Eis 5, Fuß 9, Hund
–> Resultat:
file_3.csv: 1, 4 3, 5 5, 9
Anmeldungsdatum: Beiträge: 19 |
Hallo, wie kopiert man in Python die Reihe 1 aus file_1.csv und Reihe 1 aus file_2.csv in file_3.csv ? Bsp.: file_1.csv: 1, Hase 3, Bus 5, Schnecke file_2.csv: 4, Eis 5, Fuß 9, Hund –> Resultat: file_3.csv: 1, 4 3, 5 5, 9 |
||||||
(Themenstarter)
Anmeldungsdatum: Beiträge: 19 |
Mein Ansatz wäre:
|
||||||
Anmeldungsdatum: Beiträge: 11180 Wohnort: München |
Das ginge z.B. so:
|
||||||
Anmeldungsdatum: Beiträge: 11180 Wohnort: München |
Man kann sowas auch mit weniger Tipp-Aufwand in der Shell erledigen, solange es keine Besonderheiten beim CSV-Dialekt gibt (Quoting, Newlines usw.): paste <(cut -d ',' -f 1 file_1.csv) <(cut -d ',' -f 1 file_2.csv) | sed 's/\t\+/, /g' > file_3.csv |
||||||
Anmeldungsdatum: Beiträge: 17552 Wohnort: Berlin |
Etwas umständlich:
Schön einfach, wenn auch lang, ist die Arbeit mit colrm, nl und join:
Man jagd file_1.csv durch colrm und entfernt alles ab Spalte 4. (Man nennt es Spalte, nicht Reihe, siehe auch Oper, Kino, usw. - ich sitze in Reihe 8. Reihe ist Zeile.) Anschließend lässt man nl (number lines) die Zeilen nummerieren. Analog für Datei 2, aber hier schneidet man schon ab Spalte 2 ab. Beide Male geht der Output in eine temporäre Zwischendatei. Mit join verbindet man die Dateien anhand der Zeilennummer. Mit colrm schneidet man dann die Zeilennummer wieder fort. Übersichtlicher:
|
||||||
(Themenstarter)
Anmeldungsdatum: Beiträge: 19 |
|||||||
Anmeldungsdatum: Beiträge: 2123 Wohnort: Gelsenkirchen |
awk 'BEGIN{FS=OFS=", "} FNR==NR{a[FNR]=$1; next} {print a[FNR], $1}' file1.csv file2.csv FS und OFS stehen für Field Separator (Komma für Eingabe) bzw Output Field Separator (Komma für Ausgabe). Der "FNR==NR"-Trick sorgt dafür, dass zuerst nur file1 behandelt wird (Datei-Zeilennummer = Gesamt-Zeilennummer). Das next-Kommando dient dazu, dass alle weiteren Anweisungen ignoriert werden und er sofort zur nächsten Zeile springt. Wenn er die erste Datei durch hat, ist der Gesamt-Zähler höher als der Zähler für die Datei und somit kommt nur noch die zweite Bedingung zur Anwendung. Ist zugegeben nicht ganz leicht zu durchschauen, wenn man es nicht kennt, aber eine nette Fingerübung. ☺ EDIT: Hier noch ein bißchen anders ausgedrückt, indem quasi umgekehrt gedacht wird. Dabei kommt es nur zum "print", wenn vorher die Zeile in "a" abgelegt wurde. Damit spart man sich auch das "next": awk 'BEGIN{FS=OFS=", "} a[FNR]{print a[FNR], $1} {a[FNR]=$1}' file1.csv file2.csv Oder ohne den BEGIN-Block: awk -F, 'NR>FNR{print a[FNR]", "$1} {a[FNR]=$1}' file1.csv file2.csv |