Programmieren - alles kontrollieren 4.934 Themen, 20.613 Beiträge

Textdatei mittels festen Spaltenbreiten in MySQL per PHP

uspc / 11 Antworten / Flachansicht Nickles

Hallo, eine Textdatei mit etwa 100 Zeilen und jeweils 160 aneinandergereihten Zeichen (Positionen) möchte ich in MySQL bringen. Als Werkzeug dazu soll PHP dienen. Ich möchte also diese Textdatei öffnen und per Angabe wie zB. von Pos. 1-8 ist Spalte A, 9-12 ist Spalte B, 13-20 ist Spalte C usw. umschreiben. Dazu stelle ich mir dann eine erzeugte CSV-Datei vor, wo jeweils an den Positionen ein Komma oder ein Semikolon steht.

Frage: Ist substr der richtige Weg oder geht das auch viel einfacher/anders?

Beispiel für die Textdatei:

RHB2158400068576519684621FG5416854621654 und länger

RFJ68621654632162036546520651652165165065 und länger

usw.

soll jetzt in die DB, einfach umwandeln in:

RHB2158;4000;68576519;684621F;G5416854;621654

RFJ68621;6546;3216203;65465206;51652165;165065

Diese Datei kann dann so die DB problemlos einlesen. Ich hoffe, ich konnte mich verständlich ausdrücken... Achso, Hinweis: das Ganze bedient dann ein User, also kein Zugriff auf phpMyAdmin oder so. Das muss alles per Weboberfläche und entsprechenden PHP-Scripten laufen.

Vielen Dank!  Gruß uspc

bei Antwort benachrichtigen
uspc Borlander „Wie liest Du denn lokal ein? LOAD DATA INFILE sollte da ...“
Optionen

Ich zeig mal, wie ich das bis jetzt gemacht hatte:

$handle = fopen ("dateiablage/kopie.txt", "r");
while (!feof($handle)) {

        $buffer = fgets($handle);
                        
        $SATZART = substr($buffer, 0, 4);    
        $USER = substr($buffer, 5, 7);            
        $FKT = substr($buffer, 8);        
        $FKTVAR = substr($buffer, 9, 23);        
        usw.

    $sql = "INSERT INTO tabelle (
        SATZART,
        USER,
        FKT,
        FKTVAR, usw. )
        VALUES (
        '$SATZART',
        '$USER',
        '$FKT',
        '$FKTVAR', usw.)

    $go = mysql_query($sql) or die (mysql_errno().": sql ".mysql_error);
}
fclose ($handle);
........................................

Das funktionierte, nur Abbruch bei 400-700 Datensätzen (Zeilen). Ich denke, da ist INSERT in der While-Schleife ungeeignet, es wären ca. 4500 Zeilen.
Die txt-Datei ist 765kB groß. Die Variablennamen lauten gleich wie den Spaltennamen der Tabelle.

Im neuen Versuch mache ich das so:
LOAD DATA INFILE 'kopie.txt' INTO TABLE hilfstabelle
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

Dann ist die gesamte Textdatei Zeile für Zeile in einer Tabelle, und dort in einer Spalte (inhalt), 171 Zeichen pro Zeile lang.
Das klappt in 0,irgendwas Sekunden.
Und nun möchte ich die Spalten per SQL von dieser Hilfs-Tabelle in die richtige Tabelle bringen, die wie oben auch die Spaltennamen hat.
Dazu muss SELECT SUBSTRING die einzelnen Trenner auslesen, also etwa so:

SELECT SUBSTRING(inhalt, 152, 170) FROM hilfstabelle;  (das habe ich vorher per PHP gemacht).

Ist das der richtige Weg? Wie kann ich per MySQL mit SELECT mehrere Spalten ausgeben? Danke schon mal vorab, uspc.

bei Antwort benachrichtigen