2016-11-02 6 views
1

Ich versuche, meine PHP-Kenntnisse für die folgende Aufgabe zu reaktivieren: Ich habe eine größere Textdatei mit unsortierten Zeilen von Komma getrennten Informationen, jeder Wert von einem '' 'eingeschlossen. Jede Zeile kann als ein einzelnes Dataset verstanden werden, der erste Wert der Zeile sagt mir, in welche Tabelle die Zeile gehörtLesen, sortieren und teilen Sie die Textdatei in Blöcke

Jetzt muss ich die Datei lesen, sortieren Sie die Zeilen (so dass die Zeilen zu den gleichen gehören Tabelle sind zusammen), erkennen Sie die verschiedenen Blöcke und speichern Sie sie in separaten Textdateien.Danach kann ich einen schnellen Import in eine MySQL-Datenbank mit Ladedaten aus der Datei ..

Also, ich kann die Datei öffnen und sortieren Sie die Zeilen über diese:

<?php 
$lines = file("importfile_unsorted.txt"); 
natsort($lines); 
file_put_contents("importfile_sorted.txt", implode($lines)); 
?> 

Dies funktioniert. Aber jetzt bleibe ich stecken. importfile_sorted.txt sieht wie folgt aus:

"AV1","0","0","0","0","0","0","0","0","0","0","0:0","0:0","0:0" 
"AV2","0","0","0","0","0","0","0","0","0","0","0:0","0:0","0:0" 

.... [dies der erste Block sein würde, alle diese Zeilen in „av.txt“ In der nächsten Zeile der neue Block „F“ beginnt gespeichert werden soll mit mehreren Linien:

"F1","D","D","Deutsch",,,"0","W" 
"F4","E","E","Englisch",,,"0","W" 
"F7","K","K","Kath.Religionslehre",,,"0","W" 
"F8","Ev","Ev","Evang.Religionslehre",,,"0","W" 
"F9","Eth","Eth","Ethik",,,"0","W" 

... [all diesen Zeilen sparen mit Fxx in Datei f.txt beginnen und gehen Sie zum nächsten Block]

"G1","PhL","PÜG" 
"G2","ChL","ChÜ" 

..

"K1","5a","5a",,"304","Ma","Wei","0","16","16","5",,,,,"1","1","0",,"0","0","0","0" 
"K2","5b","5b",,"303","Wo","Hm","0","32","16","5",,,,,"1","1","0",,"0","0","0","0" 
"K3","5c","5c",,"302","Gr","Ro","0","32","16","5",,,,,"1","1","0",,"0","0","0","0" 

... und so weiter. Später gibt es Blöcke mit einer festen ersten Spalte wie folgt aus:

"PL","Di 1","Ba","Q12","Inf1","CoR1" 
"PL","Di 1","Bb","Q12","F","Ü2" 
"PL","Di 1","Eg","Q12","L","M23" 

... und

"PLS","Di 1","Am"," frei " 
"PLS","Di 1","Bad"," ----" 
"PLS","Di 1","Bk"," frei " 

... von mehreren anderen Blöcken gefolgt (L1 ... L97, M, R1 ... R40, U1 ... U560).

Ich kenne alle möglichen "Bezeichner" (AVx, Fx, Gx, .. PL, PLS ..) der Blöcke, aber es ist auch möglich, dass ein Block ausgelassen wird und die Eingabedatei keine einzige Zeile von es überhaupt. Die Eingabedatei enthält ungefähr 4000 Zeilen zusammen, daher sollte die Leistung nicht zu niedrig sein (obwohl es nicht zeitkritisch ist, wird der Import vielleicht 10 mal im Jahr durchgeführt ..).

Also, gibt es eine Möglichkeit, dies auf eine "intelligente" und schnelle Weise zu tun, oder sollte ich die Eingabedatei Zeile für Zeile lesen, den ersten Wert erkennen und merken, die aktuelle Zeile zu einer Ergebniszeichenfolge und Schleife hinzufügen bis ein neuer erster Wert auftritt?

Danke für Ihre Hilfe! Heiko

+0

Warum die Datei in einzelne Dateien aufgeteilt? Was ich tun würde, ist eine temporäre Tabelle, die auch diese erste Spalte hat, zu importieren, alles in das. Dann benutze PHP, um eine bestimmte Liste von Spalte 1 abzufragen, laufe um und führe einfach die Abfrage aus 'INSERT INTO {$ tableName} SELECT col2, col3 ... etc FROM tmp_table WHERE col1 =' {$ tableName} ''. Wenn Sie eine variable Anzahl von Spalten pro Tabelle haben, beschreiben Sie einfach jede Tabelle in PHP, um die Spalten zu erhalten und wählen Sie nur das aus, was Sie brauchen.Stellen Sie außerdem die temporäre Tabelle so ein, wie Sie die größte Spaltenanzahl benötigen. –

+0

Danke Jonathan für deine schnelle Antwort. Ich würde es vorziehen, zu splitten, da das Importieren von Daten in mysql mit load data infile einfach und schnell ist, also suche ich nach einer guten Möglichkeit, die Eingabedatei zu teilen. Außerdem variieren die Datentypen zwischen verschiedenen Blöcken (z. B. das zweite Feld in Block 1 ist int, in Block 2 mal ...). – Heiko

+0

@ Jonathan Kuhn, ich hatte endlich die Zeit, Ihrem Vorschlag zu folgen. Ich dachte, es wäre komplizierter, aber alles läuft glatt und schnell, also danke, dass du mich in die richtige Richtung gelenkt hast! – Heiko

Antwort

0

die im CSV-Parser gebaut verwenden, spaltet das nicht manuell http://php.net/manual/en/function.str-getcsv.php

+0

Hm. Ok, das würde die gesamte Eingabedatei in ein riesiges Array bringen - aber ich muss immer noch die verschiedenen Blöcke identifizieren und sie in separaten Textdateien speichern, richtig? – Heiko

+0

Korrekt, Sie verwenden dies ist die Daten analysieren, dann beginnen Sie zu tun, was Sie damit tun werden. – TravisO

Verwandte Themen