OT Gute Idee zur Datenkonvertierung gesucht
Hallo Liste, suche nach einer guten Idee umd folgendes Problem zu lösen. Eine große Datei mit Daten, Felder sind durch Kommata seperiert und Texte sind mit Gänsefüßchen gekennzeichnet. Eine richtige Daten.csv Datei. Leider sind in jedem Datensatz auch Betragsfelder enthalten und bei den Beträgen ist auch teilweise ein Kommata vorhanden z.B "Text",125,73,EUR, usw. Wenn es sich um einen glatten Betrag handelt, steht nur 125 im Datenfeld drin, also keine 125,00 . Diese großen Datendateien sollen nun mit mysqlimport in eine komplette Datenbank eingelesen werden. Beim Einlesen kommt es nun zu Eingabefehler, bedingt durch die zusätzlichen Kommatas in den Betragsfeldern. Hat jemand aus der Liste eine gute Idee, wie ich das Problem mit Bordmitteln, SuSE 8.2 KDE 3.x lösen kann??? Eine Bearbeitung mit OpenOffice hat keine Lösung gebracht. Auch dort schiebt sich der ganze Datensatz um entsprechende Felder weiter. Eine manuelle Bearbeitung verbietet sich schon aufgrund der großen Datenmenge (rd. 100 000 Datensätze) Es fehlt mir zur Zeit der richtige Logikansatz, um an das Problem heranzugehen. Leichter Klapps auf den Hinterkopf oder kleiner Tritt in die Sitzfläche reicht aus. Mit einem herzlichen Dank schon mal im voraus -- Rolf-Hubert Pobloth <rhp-berlin@surfnett.de>
Hallo Rolf, schick doch mal 10 "typische" Zeilen aus Deiner Datei, damit man sich das mal genauer ansehen kann. Gruss Karl ----- Original Message ----- From: "Rolf-Hubert Pobloth" <rhp-berlin@surfnett.de> To: <suse-linux@suse.com> Sent: Thursday, August 14, 2003 12:41 PM Subject: OT Gute Idee zur Datenkonvertierung gesucht
Hallo Liste,
suche nach einer guten Idee umd folgendes Problem zu lösen.
Eine große Datei mit Daten, Felder sind durch Kommata seperiert und Texte sind mit Gänsefüßchen gekennzeichnet.
Eine richtige Daten.csv Datei.
Leider sind in jedem Datensatz auch Betragsfelder enthalten und bei den Beträgen ist auch teilweise ein Kommata vorhanden z.B "Text",125,73,EUR, usw. Wenn es sich um einen glatten Betrag handelt, steht nur 125 im Datenfeld drin, also keine 125,00 .
Diese großen Datendateien sollen nun mit mysqlimport in eine komplette Datenbank eingelesen werden. Beim Einlesen kommt es nun zu Eingabefehler, bedingt durch die zusätzlichen Kommatas in den Betragsfeldern.
Hat jemand aus der Liste eine gute Idee, wie ich das Problem mit Bordmitteln, SuSE 8.2 KDE 3.x lösen kann???
Eine Bearbeitung mit OpenOffice hat keine Lösung gebracht. Auch dort schiebt sich der ganze Datensatz um entsprechende Felder weiter. Eine manuelle Bearbeitung verbietet sich schon aufgrund der großen Datenmenge (rd. 100 000 Datensätze)
Es fehlt mir zur Zeit der richtige Logikansatz, um an das Problem heranzugehen. Leichter Klapps auf den Hinterkopf oder kleiner Tritt in die Sitzfläche reicht aus.
Mit einem herzlichen Dank schon mal im voraus
-- Rolf-Hubert Pobloth <rhp-berlin@surfnett.de>
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Rolf-Hubert Pobloth am Donnerstag, 14. August 2003 13:03:
Hallo Karl,
dieses ist eine PM mit einem Dateianhang. Die Datei enthält ein paar Datensätze.
Na, da kannst du doch prima auf den Vorschlag von Adalbert bzw. Joachim aufbauen. Es handelt sich ja nur um die letzten drei Felder: ... ,,23,"Euro" --> ... ,,"237,00","Euro" oder ... ,23,42,"Euro" -->... ,"23,42","Euro" Ist das drittletzte Feld leer, ist das vorletzte OK (evtl. nach Belieben noch die Nachkommastellen setzen). Ist das drittletzte Feld nicht leer, muss es mit dem vorletzten zusammengefasst werden. Und es ist natürlich ein neues, leeres drittletztes Feld eingefügt werden. -- Gruß MaxX 8-)
Korrektur!!! Matthias Houdek am Samstag, 16. August 2003 13:19:
Rolf-Hubert Pobloth am Donnerstag, 14. August 2003 13:03:
Hallo Karl,
dieses ist eine PM mit einem Dateianhang. Die Datei enthält ein paar Datensätze.
Na, da kannst du doch prima auf den Vorschlag von Adalbert bzw. Joachim aufbauen. Es handelt sich ja nur um die letzten drei Felder:
... ,,23,"Euro" --> ... ,,"237,00","Euro" ^^ schön wär's, aber so ist es richtig: ... ,,23,"Euro" --> ... ,,"23,00","Euro"
oder ... ,23,42,"Euro" -->... ,"23,42","Euro" ^^ und hier fehlte ein Komma: ... ,23,42,"Euro" -->... ,,"23,42","Euro"
Ist das drittletzte Feld leer, ist das vorletzte OK (evtl. nach Belieben noch die Nachkommastellen setzen). Ist das drittletzte Feld nicht leer, muss es mit dem vorletzten zusammengefasst werden. Und es ist natürlich ein neues, leeres drittletztes Feld eingefügt werden.
-- Gruß MaxX 8-)
-- Gruß MaxX 8-)
* On Thu, 14 Aug 2003 at 12:41 +0200, Rolf-Hubert Pobloth wrote:
Eine große Datei mit Daten, Felder sind durch Kommata seperiert und Texte sind mit Gänsefüßchen gekennzeichnet.
Eine richtige Daten.csv Datei.
Leider sind in jedem Datensatz auch Betragsfelder enthalten und bei den Beträgen ist auch teilweise ein Kommata vorhanden z.B "Text",125,73,EUR, usw. Wenn es sich um einen glatten Betrag handelt, steht nur 125 im Datenfeld drin, also keine 125,00 .
Auweia .... :-(
Hat jemand aus der Liste eine gute Idee, wie ich das Problem mit Bordmitteln, SuSE 8.2 KDE 3.x lösen kann???
Nuja, mit einem kleinem Perl-Skript sollte das eigentlich zu lösen sein. Meine Grundidee basiert darauf, daß ja bekannt ist, wieviele Felder es in einer Zeile gibt. Wenn nun in einer Zeile mehr Felder sind, dann sind soviele Kommatas zuviel, wie Felder zuviel sind. Wenn nun bekannt ist, in welchen Feldern die Kommatas sein können, dann sollten sich die Felder leicht isolieren lassen können und richtig quoten. Ansatz: while (<>) { split(/,/); $len = scalar @_; if ($len==5) { // Alles okay - Zeile unverändert rauschreiben print; } else { // Felder aus @_ rausklauben und mit Kommatas versehen // rausschreiben ..... } } /apm -- GPG welcome, request public key: mailto:adalbert+key@lopez.at
Adalbert Michelic schrieb:
Nuja, mit einem kleinem Perl-Skript sollte das eigentlich zu lösen sein. Meine Grundidee basiert darauf, daß ja bekannt ist, wieviele Felder es in einer Zeile gibt. Wenn nun in einer Zeile mehr Felder sind, dann sind soviele Kommatas zuviel, wie Felder zuviel sind. Wenn nun bekannt ist, in welchen Feldern die Kommatas sein können, dann sollten sich die Felder leicht isolieren lassen können und richtig quoten.
Ansatz:
while (<>) { split(/,/); $len = scalar @_; if ($len==5) { // Alles okay - Zeile unverändert rauschreiben print; } else { // Felder aus @_ rausklauben und mit Kommatas versehen // rausschreiben ..... } }
oder so: while (<>) { # Daten aufdröseln @daten=split(/,/); # Wenns 29 Felder sind, also Preis mit Cent if ($#daten == 29) { # Dann Preis neu zusammenbauen $daten[27].=".$daten[28]"; # Und das Centfeld löschen splice (@daten,28,1); } } evtl. wieder zusammenbauen weiter zur SQL-Fütterung mfg. Joachim -- Englisch für Fortgeschrittene the cow business Der Kuhhandel Zufallssignatur Nr.: 138
On Don, 14 Aug 2003 at 13:30 (+0200), Joachim Reiter, EMV-ELV wrote:
Adalbert Michelic schrieb:
Nuja, mit einem kleinem Perl-Skript sollte das eigentlich zu lösen sein. Meine Grundidee basiert darauf, daß ja bekannt ist, wieviele Felder es in einer Zeile gibt. Wenn nun in einer Zeile mehr Felder sind, dann sind soviele Kommatas zuviel, wie Felder zuviel sind. Wenn nun bekannt ist, in welchen Feldern die Kommatas sein können, dann sollten sich die Felder leicht isolieren lassen können und richtig quoten.
Ansatz:
[...] oder so: while (<>) { # Daten aufdröseln @daten=split(/,/); # Wenns 29 Felder sind, also Preis mit Cent if ($#daten == 29) { # Dann Preis neu zusammenbauen $daten[27].=".$daten[28]"; # Und das Centfeld löschen splice (@daten,28,1); } } evtl. wieder zusammenbauen
Das klappt so nicht. Beispiel: 12,34,56 Ist das nun 12,34 und 56 oder 12 und 34,56? Der Datenexport ist so nicht eindeutig - allein mit Programmlogik kann man dem Problem nicht beikommen. Nur wenn man weiss, wie die Felder aufgebaut sind, in welchen Feldern Nachkommastellen auftreten können und wo nicht, kann man über eine Analyse der Zeile _mit einer gewissen Wahrscheinlichkeit_ ein korrektes Splitting erreichen. Aber das wird sehr aufwändig, weil ja nicht alle Felder gefüllt sein müssen und man dann nicht mal mehr weiss, wo die Textfelder sind. Um es mal vorsichtig auszudrücken: der Export ist Murks. Wer einen Trenner benutzt, der auch in Feldern auftauchen kann, gehört zur manuellen Nachbearbeitung verurteilt ;-) Jeder andere Trenner als Komma und Punkt wäre sinnvoll gewesen (ein ; oder | kann höchstens in Textfeldern auftauchen und da sind sie durch die "" identifizierbar) - und das kann man sogar Excel & Co. beibringen. Jan
Hallo, ich hab schon lange nicht mehr programmiert, aber so wie´s sich für mich darstellt sollten die Daten nocheinmal mit Semikolon als Separator exportiert werden. Ansonsten sehe ich keine Chance die Beträge wieder richtig automatisiert aufzudröseln. Gruß Sven ----- Original Message ----- From: "Rolf-Hubert Pobloth" <rhp-berlin@surfnett.de> To: <suse-linux@suse.com> Sent: Thursday, August 14, 2003 12:41 PM Subject: OT Gute Idee zur Datenkonvertierung gesucht
Hallo Liste,
suche nach einer guten Idee umd folgendes Problem zu lösen.
Eine große Datei mit Daten, Felder sind durch Kommata seperiert und Texte sind mit Gänsefüßchen gekennzeichnet.
Eine richtige Daten.csv Datei.
Leider sind in jedem Datensatz auch Betragsfelder enthalten und bei den Beträgen ist auch teilweise ein Kommata vorhanden z.B "Text",125,73,EUR, usw. Wenn es sich um einen glatten Betrag handelt, steht nur 125 im Datenfeld drin, also keine 125,00 .
Diese großen Datendateien sollen nun mit mysqlimport in eine komplette Datenbank eingelesen werden. Beim Einlesen kommt es nun zu Eingabefehler, bedingt durch die zusätzlichen Kommatas in den Betragsfeldern.
Hat jemand aus der Liste eine gute Idee, wie ich das Problem mit Bordmitteln, SuSE 8.2 KDE 3.x lösen kann???
Eine Bearbeitung mit OpenOffice hat keine Lösung gebracht. Auch dort schiebt sich der ganze Datensatz um entsprechende Felder weiter. Eine manuelle Bearbeitung verbietet sich schon aufgrund der großen Datenmenge (rd. 100 000 Datensätze)
Es fehlt mir zur Zeit der richtige Logikansatz, um an das Problem heranzugehen. Leichter Klapps auf den Hinterkopf oder kleiner Tritt in die Sitzfläche reicht aus.
Mit einem herzlichen Dank schon mal im voraus
-- Rolf-Hubert Pobloth <rhp-berlin@surfnett.de>
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
On Thu, Aug 14, 2003 at 12:41:36PM +0200, Rolf-Hubert Pobloth wrote:
Eine richtige Daten.csv Datei.
Nein, leider nicht. http://www.dclp-faq.de/q/q-mysql-csv-export.html beschreibt das korrekt exportierte CSV. Deine Daten sind unbrauchbar und nicht automatisiert lesbar. Kristian
Hallo Rolf,
Eine große Datei mit Daten, Felder sind durch Kommata seperiert und Texte sind mit Gänsefüßchen gekennzeichnet.
Eine richtige Daten.csv Datei.
Leider sind in jedem Datensatz auch Betragsfelder enthalten und bei den Beträgen ist auch teilweise ein Kommata vorhanden z.B "Text",125,73,EUR, usw. Wenn es sich um einen glatten Betrag handelt, steht nur 125 im Datenfeld drin, also keine 125,00 .
ich mach das immer mit OpenOffice. Suche nach ", und ersetze mit "; oder "TAB und schon kannst du die Datei wie gewünscht handhaben. Ist zwar nicht unbedingt Unix typisch die Lösung aber dafür sehr einfach. Ach so du könntest dir die Datei dann auch gleich noch in eine Tabelle, Dbase oder was auch immer wandeln, wenn du willst ;) Gruss Stefan Gruss Stefan
participants (9)
-
Adalbert Michelic
-
Jan.Trippler@t-online.de
-
Joachim Reiter, EMV-ELV
-
Karl Sinn
-
Kristian Koehntopp
-
Matthias Houdek
-
Rolf-Hubert Pobloth
-
stefan manteuffel
-
Sven Reimann