Import Datum aus Textdatei / Format umwandeln mySQL+PHP
Marina G.
- datenbank
Hallo liebes Forum,
ich habe eine Textdatei.
Diese Datei enthält Daten, die ich in eine mySQL DB importiere.
Mit dem Befehl:
LOAD DATA INFILE 'liste.txt' INTO TABLE jobliste FIELDS TERMINATED BY '■' LINES TERMINATED BY ' ' (spalte_datum, spalte_2, spalte)"
Das Datum in Textdatei hat das Format 13.01.05 (dd.mm.jj)
Die Spalte in der Datenbank ist VARCHAR(8)
Bis dahin funktioniert alles prima.
Leider kann ich jetzt nicht richtig nach Datum sortieren (ORDER BY)
Wie kann ich das Datum beim importieren umwandeln, damit es in
der Datenbank in das Format DATE 0000-00-00 (jjjj-mm-dd) past.
Gruß
Marina
Halihallo Marina
Das Datum in Textdatei hat das Format 13.01.05 (dd.mm.jj)
Die Spalte in der Datenbank ist VARCHAR(8)
Wie kann ich das Datum beim importieren umwandeln, damit es in
der Datenbank in das Format DATE 0000-00-00 (jjjj-mm-dd) past.
Entweder du lässt ein PHP-Script die CSV-Datei auslesen und wandelst
die Daten-Werte über PHP in das von MySQL geforderte Format, oder
du verwendest eine temporäre Import-Tabelle, lädst dort die CSV über
LOAD DATA INFILE ein und überführst dann dieses Zwischenergebnis
mittels
REPLACE INTO real_table SELECT ... FROM temp_table
in die "richtige", produktive Tabelle ein (indem du aber den Datums-
Wert entsprechend in ISO-8601 bringst).
Enpfehlen würde ich ersteres: Schreib ein Script, welches die CSV
Zeilenweise ausliest, den Datums-Wert in das ISO-8601 Format bringt
und die Werte über einen INSERT in die Tabelle einpflegt (bzw. eine
neue CSV generiert, welche dann über LOAD DATA INFILE eingespiesen
wird).
Viele Grüsse
Philipp
Hi Philipp,
DANKE für Deine Hilfe.
Kannst du mir bitte Vorschlag eins etwas genauer beschreiben, wie man
das richtig macht. Wäre für Deine Hilfe dankbar.
(ist eine Textdatei .txt)
Gruß
Marina
Halihallo Marina
Kannst du mir bitte Vorschlag eins etwas genauer beschreiben, wie man
das richtig macht. Wäre für Deine Hilfe dankbar.
(ist eine Textdatei .txt)
Wo hast du denn genau ein Problem? - Wo bist du dir der Umsetzung
nicht sicher?
Prinzipiell würde ich so vorgehen:
Verbindung zur Datenbank öffnen
.txt-Datei öffnen (fopen)
jede Zeile einlesen (fgets)
diese zeile in einzelne Werte aufsplitten (explode)
den Wert mit dem Datum behandeln und in ISO-8601 überführen
(Stichwort: substring)
INSERT INTO table (...) VALUES (...) generieren
Query in der DB absetzen
.txt-Datei schliessen (fclose)
Verbindung zur Datenbank schliessen
Fehlerbehandlungsroutine schreiben um Fehler zu sehen und abzufangen
... und das jetzt in PHP umsetzen.
Viele Grüsse
Philipp
Hallo Phillipo,
wie macht man folgendes in PHP:
.txt-Datei öffnen (fopen)
jede Zeile einlesen (fgets)
diese zeile in einzelne Werte aufsplitten (explode)
den Wert mit dem Datum behandeln und in ISO-8601 überführen
Wie ändere ich das Datum in der Textdatei.
So sehen die Zeilen in der Textdatei aus.
Wert1aþWert2aþ13.01.05ÿ
Wert1bþWert2bþ03.01.05ÿ
usw...
Das danach die Zeilen so aussehen
Wert1aþWert2aþ20050113ÿ
Wert1bþWert2bþ20050103ÿ
usw...
DANKE
Grüß
Fragetante
Hallo Philipp,
jede Zeile einlesen (fgets)
Ich habe in der Textdatei nachgeschaut. Die Daten haben keinen Zeilenumbruch. SORRY
So sieht es aus:
Wert1aþWert2aþ13.01.05ÿWert1bþWert2bþ03.01.05ÿ
usw...
Das danach die Zeilen so aussehen
Wert1aþWert2aþ20050113ÿWert1bþWert2bþ20050103ÿ
usw...
DANKE
Grüß
Marina
Halihallo Marina
jede Zeile einlesen (fgets)
Ich habe in der Textdatei nachgeschaut. Die Daten haben keinen Zeilenumbruch. SORRY
ich glaube schon, aber du verwendest in deinem Editor einen anderen
Zeichensatz, als der mit dem die CSV-Datei erstellt wurde.
Wert1aþWert2aþ13.01.05ÿWert1bþWert2bþ03.01.05ÿ
Das danach die Zeilen so aussehen
Wert1aþWert2aþ20050113ÿWert1bþWert2bþ20050103ÿ
http://www.php.net/substr lesen!
http://ch2.php.net/manual/de/language.operators.string.php
lesen um die Teilstrings von substr wieder zusammenzuhängen.
Damit lässt sich folgendes machen:
Jahr von Eingabe auslesen => $jahr
Monat von Eingabe auslesen=> $monat
Tag " " " => $tag
$ausgabe_datum = "20$jahr$monat$tag";
Ein Tipp: Versuche erstmal die einzelnen Werte und Datensätze auszu-
lesen. Die Datums-Transformation ist erst dein sekundäres Problem...
Viele Grüsse
Philipp
Hallo Philipp,
Kann das sein, das substr hier nicht funktioniert?
Da Wert1 & Wert2 keine feste Zeichenlänge haben.
Wert1aþWert2aþ13.01.05ÿ
Das Problem für mich ist. Tag, Monat & Jahr an der Position
(zwischen þ ÿ) herauszuholen.
Richtig ordnen kann ich.
Und das neue Format an der richtigen Stelle reinschreiben, kann ich leider auch nicht.
Den Rest bekomme ich sicherlich hin.
Vielleicht kannst du mir ja etwas PHP-Code zeigen.
DANKE
Gruß
Marina
Halihallo Marina
Kann das sein, das substr hier nicht funktioniert?
Da Wert1 & Wert2 keine feste Zeichenlänge haben.
Wert1aþWert2aþ13.01.05ÿ
Richtig. Deswegen habe ich auch schon gesagt, dass das extrahieren
bzw. umwandeln der Daten auch nicht dein primäres, sondern sekundäres
Problem ist. Ich sagte schon: befasse dich zuerst damit, die
einzelnen Felder und Datensätze auseinanderzubrechen (nochmals:
Strichwort explode). Dann hast du das Feld Datum in einem String und
und dieser folgt einem genauen Muster (hoffentlich...).
Das Problem für mich ist. Tag, Monat & Jahr an der Position
(zwischen þ ÿ) herauszuholen.
Richtig ordnen kann ich.
Und das neue Format an der richtigen Stelle reinschreiben, kann ich leider auch nicht.
Du denkst zu straight. Musst ja nicht grad von 0 auf 100 in einer
Sekunde beschleunigen wollen...
Also nochmals, ich muss ja ebenfalls nicht gleich mit der Türe ins
Haus fallen...:
zuerst musst du mal die einzelnen Datensätze trennen:
Dieses 'ÿ'-Zeichen scheint hier der Delimiter zu sein. Also, mach
das mal, trenn den String mal an diesen Zeichen. Dann hast du über
explode schonmal ein Array aus Datensätzen (in CSV sind die
Datensätze die Zeilen).
So, und nun interessieren dich natürlich die Daten (jetzt mal nicht
als plural von Datum zu verstehen), hier scheint 'þ' dein Delimiter
zu sein. Nun OK, iteriere über dein vorher generiertes Array von
Datensätzen (also mach folgendes für jeden Eintrag im Array) und
splitte diese Strings erneut über explode bei 'þ' auf. So hast du
nun erneut ein Array aus Feldern deines aktuell verarbeiteten
Datensatzes.
in $felder[0] steht dann 'Wert1a', $felder[1] steht 'Wert1b' und
in $felder[2] steht dein '03.01.05' und jetzt kannst du mittels
substr das Datum in $felder[2] in ISO-8601 überführen.
Dann bildest du einen SQL-Query mit den Daten aus dem Array $felder.
Vielleicht kannst du mir ja etwas PHP-Code zeigen.
Nö, den Spass will ich dir nicht nehmen, sonst hast du ja gar nichts
von diesem Forum.
Viele Grüsse
Philipp
Hallo Philipp!
Das hat jetzt zwar so überhaupt nichts mit dem aktuellen Thread zu tun, aber ich habe gerade eine Diskussion zum Thema "möchtegern-Hochverfügbarkeit" gelesen, die Dich vielleicht interessiert: http://www.rootforum.de/forum/viewtopic.php?t=33553
Grüße
Andreas
Halihallo Andreas
Das hat jetzt zwar so überhaupt nichts mit dem aktuellen Thread zu tun, aber ich habe gerade eine Diskussion zum Thema "möchtegern-Hochverfügbarkeit" gelesen, die Dich vielleicht interessiert: http://www.rootforum.de/forum/viewtopic.php?t=33553
Oh, vielen Dank für deine Aufmerksamkeit!
Da habe ich einiges gelernt, als ich mich notgedrungen noch etwas
in DRBD, UML (User Mode Linux), HA und HP einlesen musste, um den
Beitrag oder besser die enthaltenen Wörter zu verstehen :-)
Danke für den Link. Bin dadurch auch auf
http://www.lcic.org/ (Linux Clustering Information Center)
http://www.lcic.org/ (Linux High Availability)
gestossen. Finde ich auch informativ.
Viele Grüsse und Danke
Philipp