Script für Zusammenführung einer CSV Datei

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
gnude
Beiträge: 1569
Registriert: 14.09.2009 22:05:28
Kontaktdaten:

Script für Zusammenführung einer CSV Datei

Beitrag von gnude » 30.03.2011 22:39:14

Hallo,
ich habe folgendes Problem:
Ich habe eine CSV Datei, die aus xt-commerce Exportiert wurde.
In dieser sind Artikelnummern, Bezeichnungen , Bilder und Preise.
Die Datei ist relativ gross (passt nicht mehr in Calc).
Nun möchte ich diese Datei Zeilenweise durchsuchen und Werte aus einer zweiten Datei
austauschen lassen. In dieser Datei sind die Werte Artikelnummer und Artikelname.
Diese beiden Werte sollen nun in die erste Datei übernommen werden, alle anderen Felder aber
unangetastet bleiben.

Als Feldtrenner ist ; hinterlegt, als Textfeld ""

Wer kann mir helfen???

uname
Beiträge: 12421
Registriert: 03.06.2008 09:33:02

Re: Script für Zusammenführung einer CSV Datei

Beitrag von uname » 31.03.2011 07:59:02

Das lässt sich sehr leicht mit Perl-Hashes programmieren. Leider ist aus deiner Beschreibung weder erkennbar wie die Dateien genau aussehen noch welche Daten wo ausgetauscht werden sollen.
Bitte poste für jede der beiden Anfangsdateien ein kurzes Beispiel aus jeweils zwei bis drei Zeilen, damit man sich das genauer vorstellen kann. Und poste auch kurz wie das Ziel aussehen soll. Verfremde ruhig die Daten.

Benutzeravatar
The Hit-Man
Beiträge: 2248
Registriert: 21.11.2004 17:01:56
Wohnort: Menden ( Sauerland )
Kontaktdaten:

Re: Script für Zusammenführung einer CSV Datei

Beitrag von The Hit-Man » 31.03.2011 08:05:25

kenne mich nicht mit perl aus, aber unter python kann man strings super gut verarbeiten ( ist nur meine meinung ).

Code: Alles auswählen

splitline.split ()
Wer HTML postet oder gepostetes HTML quotet oder sich gepostetes oder
gequotetes HTML beschafft, um es in Verkehr zu bringen, wird geplonkt.

damals windows, früher ubuntu, danach debian, heute arch-linux ;)

Benutzeravatar
gnude
Beiträge: 1569
Registriert: 14.09.2009 22:05:28
Kontaktdaten:

Re: Script für Zusammenführung einer CSV Datei

Beitrag von gnude » 31.03.2011 11:01:32

Hallo
so hier sind die Daten,
verfremden macht ja wenig Sinn, weil die ja auch so im Shop stehen.
Die oberste Zeile benennt die Namen der Spalten.
Ich möchte aus einer zweiten Datei in der nur Artikelnummer und Artikelname stehen einen Abglich durchführen.
Kommt Artikelnummer von Datei2 in Datei1 vor, dann übernehme den Artikelname aus Datei2, behalte aber alle anderen Werte aus Datei eins.
Am besten, wenn das Ergebnis dann in eine neue Datei geschrieben wird.
Dann kann ich diese neue Datei einfach wieder importieren.
Konnte ich mich verständlich ausdrücken? :roll:


Code: Alles auswählen

"XTSOL";"action";"p_model";"p_stock";"p_sorting";"p_shipping";"p_tpl";"p_manufacturer";"p_fsk18";"p_priceNoTax";"p_priceNoTax.1";"p_priceNoTax.2";"p_priceNoTax.3";"p_tax";"p_status";"p_weight";"p_ean";"p_disc";"p_opttpl";"p_vpe";"p_vpe_status";"p_vpe_value";"p_image";"p_name.de";"p_desc.de";"p_shortdesc.de";"p_keywords.de";"p_meta_title.de";"p_meta_desc.de";"p_meta_key.de";"p_url.de";"p_cat.0";"p_cat.1";"p_cat.2";"p_cat.3";"p_cat.4";"p_cat.5"
"XTSOL";"insert";"WHE 0710";"0";"0";"0";;;"0";"505.0000";"1:505.0000::1:505.0000::1:505.0000";"1:505.0000::1:505.0000::1:505.0000";"1:505.0000::1:505.0000::1:505.0000";"1019";"1";"26.00";;"0.00";;"0";"0";"0.0000";"WHE 0710.jpg";"Wandhaube, Schr�gform, 1000x700x450mm";"die Fettauffanghauben sind komplett aus Edelstahl und punktgeschweisst, aufgeteilt in einen Auffang- und Absaugraum mit einerReihe herausnehmbarer Fettauffangfilter Typ B, Flammschutzfilter Typ B bei Luftgeschwindigkeit 1,2 m/s, Druckverlust aller Filter (114 Pa), Luftmenge je Filter 500x400x20 mm 720 m3/h, 400x400x20 mm 560 m3/h, rundumlaufende Fettauffangrinne inkl. mit eingelassenem Fettablassventil, inkl. Aufbaubeleuchtung, spritzwassergesch�tzt IP.54 (ohne Verdrahtung), Wandbefestigung, Pflege- und Reinigungshinweise beachten";;;;;;;"L�FTUNG";"HAUBEN";"Wandhauben";"WANDHAUBEN ECO-LINE";"schr�gform (Basic)";
"XTSOL";"insert";"WHE 0712";"0";"0";"0";;;"0";"559.0000";"1:559.0000::1:559.0000::1:559.0000";"1:559.0000::1:559.0000::1:559.0000";"1:559.0000::1:559.0000::1:559.0000";"1019";"1";"27.00";;"0.00";;"0";"0";"0.0000";"WHE 0712.jpg";"Wandhaube, Schr�gform, 1200x700x450mm";"die Fettauffanghauben sind komplett aus Edelstahl und punktgeschweisst, aufgeteilt in einen Auffang- und Absaugraum mit einerReihe herausnehmbarer Fettauffangfilter Typ B, Flammschutzfilter Typ B bei Luftgeschwindigkeit 1,2 m/s, Druckverlust aller Filter (114 Pa), Luftmenge je Filter 500x400x20 mm 720 m3/h, 400x400x20 mm 560 m3/h, rundumlaufende Fettauffangrinne inkl. mit eingelassenem Fettablassventil, inkl. Aufbaubeleuchtung, spritzwassergesch�tzt IP.54 (ohne Verdrahtung), Wandbefestigung, Pflege- und Reinigungshinweise beachten";;;;;;;"L�FTUNG";"HAUBEN";"Wandhauben";"WANDHAUBEN ECO-LINE";"schr�gform (Basic)";
"XTSOL";"insert";"WHE 0714";"0";"0";"0";;;"0";"619.0000";"1:619.0000::1:619.0000::1:619.0000";"1:619.0000::1:619.0000::1:619.0000";"1:619.0000::1:619.0000::1:619.0000";"1019";"1";"28.00";;"0.00";;"0";"0";"0.0000";"WHE 0714.jpg";"Wandhaube, Schr�gform, 1400x700x450mm";"die Fettauffanghauben sind komplett aus Edelstahl und punktgeschweisst, aufgeteilt in einen Auffang- und Absaugraum mit einerReihe herausnehmbarer Fettauffangfilter Typ B, Flammschutzfilter Typ B bei Luftgeschwindigkeit 1,2 m/s, Druckverlust aller Filter (114 Pa), Luftmenge je Filter 500x400x20 mm 720 m3/h, 400x400x20 mm 560 m3/h, rundumlaufende Fettauffangrinne inkl. mit eingelassenem Fettablassventil, inkl. Aufbaubeleuchtung, spritzwassergesch�tzt IP.54 (ohne Verdrahtung), Wandbefestigung, Pflege- und Reinigungshinweise beachten";;;;;;;"L�FTUNG";"HAUBEN";"Wandhauben";"WANDHAUBEN ECO-LINE";"schr�gform (Basic)";

Benutzeravatar
Meillo
Moderator
Beiträge: 9247
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Script für Zusammenführung einer CSV Datei

Beitrag von Meillo » 31.03.2011 11:10:39

uname hat geschrieben:Leider ist aus deiner Beschreibung weder erkennbar wie die Dateien genau aussehen noch welche Daten wo ausgetauscht werden sollen.
Bitte poste für jede der beiden Anfangsdateien ein kurzes Beispiel aus jeweils zwei bis drei Zeilen, damit man sich das genauer vorstellen kann. Und poste auch kurz wie das Ziel aussehen soll. Verfremde ruhig die Daten.
Dem kann ich nur zustimmen. Leider fehlt eben das viel zu oft bei Fragestellungen.


Zur Problemloesung:

Wenn du es in der Shell machen willst, also ohne Perl oder Python, dann koennte das so ablaufen:

1) Die Daten z.B. mit sed(1) umkonvertieren damit die Felder z.B. Tab-getrennt sind und nicht mehr durch Anfuehrungszeichen eingeschlossen. Etwa auf diese Art:

Code: Alles auswählen

sed 's,^",,;s,"$,,;s,";",\t,g'
2) Die Dateien per join(1) verbinden:

Code: Alles auswählen

join -t '\t' file1 file2
Achtung: Ich habe das nur aus dem Kopf anhand der Manpages geschrieben. Ob das so funktioniert muesste man mit Testdaten mal ausprobieren. Vermutlich muss man hier und da noch was anpassen.


EDIT: Nun da Beispieldaten vorliegen ist klar, dass das Format der CSV-Daten flexibler ist (leere Felder; Zeilenumbrueche), somit ist dieser Ansatz zu einfach dafuer. Fertige CSV-Module fuer Perl und Co. decken diese Faelle ab und sind deshalb die Mittel der Wahl.
Use ed once in a while!

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: Script für Zusammenführung einer CSV Datei

Beitrag von newdeb » 31.03.2011 12:29:55

CSV-Dateien sind ideales Futter für awk :)

Das folgende Skript verwendet zwei Eingabedateien:
daten1.csv: die vom TE bereitgestellten Testdaten
daten2.csv: die zweite Datei, die nur Artikelnummer und Namen enthält,
da keine Beispieldatei vorliegt, habe ich etwas zusammengebastelt:

Code: Alles auswählen

cat daten2.csv
XTSOL;Action;p_model;p_name
XTSOL;Insert;"WHE 0710";"neuer Name fuer WHE 0710"
XTSOL;Insert;"WHE 0712";"neuer Name fuer WHE 0712"
XTSOL;Insert;"WHE 0714";"neuer Name fuer WHE 0714"
Das Skript:

Code: Alles auswählen

#!/bin/bash
#
awk -F\; 'BEGIN { OFS=";" }
{
  while ((getline zeile < "daten2.csv") > 0) {
    split(zeile,artikel,";") 
    if ($3==artikel[3]) $24=artikel[4]
    break
  }
  print $0
}' daten1.csv
Das Skript tauscht die Namen aus daten1.csv mit denen aus daten2.csv aus, die übrigen Spalten bleiben unverändert.
Ich weiß nicht, ob die Spaltenummern so stimmen, (Artikelnummer in Spalte 3, Name in Spalte 24 bzw. 4),
ggf. sind die Feldnummern bzw. Array-Indices anzupassen.

Benutzeravatar
Meillo
Moderator
Beiträge: 9247
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Script für Zusammenführung einer CSV Datei

Beitrag von Meillo » 31.03.2011 13:11:00

newdeb hat geschrieben:CSV-Dateien sind ideales Futter für awk :)
Eben nicht denn CSV-Dateien haben keine klar definierbaren Recordtrenner, noch eindeutige Feldtrenner. Man muss sie parsen.

Fuer einfache CSV-Dateien sind die klassischen Unix-Tools geeignet aber nicht fuer die volle Flexibilitaet des CSV-Formats.
Use ed once in a while!

Antworten