2 Stimmen

Konvertierung einer Textdatei fester Länge in SQL

Ich muss eine Textdatei mit fester Länge in eine MySQL-Tabelle konvertieren.
Mein größtes Problem ist, dass in jeder Zeile mehrere Zellen enthalten sind, und das ist die Art und Weise, wie die Datei an mich gesendet wird, und der Hauptgrund, warum ich sie konvertieren möchte.

Die Zellen haben alle eine bestimmte Länge, sind jedoch alle in einer Zeile enthalten.

Zum Beispiel sind die ersten 3 Positionen (1 - 3) einer Zeile der IRT, die nächsten drei Positionen (4 - 6) sind der IFTC, die nächsten 5 Positionen (7 - 11) sind der FSC, usw.

Da die Datei bis zu 300 Zeilen an Datensätzen enthalten kann, brauche ich eine einfache Möglichkeit, sie direkt in die SQL-Tabellen zu importieren.

Ich habe stundenlang im Netz nach einer Lösung gesucht, aber ohne Komma-Trennung habe ich noch keine funktionierende Lösung gefunden.

Ich würde diese Lösung gerne in PHP wenn möglich ebenfalls. Und bin bereit, die langen Yards zu tun, um herauszufinden, wie man die Funktion benötigt, um dies zu tun, wenn jemand mir den Namen der Funktion geben könnte, erwarte ich nicht, dass Menschen meinen Code für mich schreiben.

7voto

ypercubeᵀᴹ Punkte 109378

Datei:

testfile.txt (4 rows)

AAA11111xx
BBB22222yy
CCC33333zz
DDD 444 aa

Tabelle:

CREATE TABLE TestLoadDataInfile
( a VARCHAR(3)
, b INT(5)
, c CHAR(2)
) CHARSET = latin1;

Code:

LOAD DATA INFILE 'D:\\...\\testfile.txt'
INTO TABLE TestLoadDataInfile
FIELDS TERMINATED BY ''
LINES TERMINATED BY '\r\n' ;

Ergebnis:

mysql> SELECT * FROM TestLoadDataInfile ;
+-----+-------+----+
| a   | b     | c  | 
+-----+-------+----+ 
| AAA | 11111 | xx | 
| BBB | 22222 | yy | 
| CCC | 33333 | zz | 
| DDD |   444 | aa | 
+-----+-------+----+ 

Die LOAD DATA INFILE-Dokumentation ist an dieser Stelle nicht sehr gut (Felder mit fester Größe). Hier sind die entsprechenden Teile:

  • I ENCLOSED BY beide leer sind (''), wird ein Format mit festen Zeilen (ohne Begrenzung) Format verwendet. Bei Festzeilenformat, werden keine Begrenzungszeichen zwischen Feldern verwendet verwendet (aber Sie können trotzdem einen Zeilen Begrenzer haben). Stattdessen werden die Spaltenwerte gelesen und geschrieben, wobei eine Feld das breit genug ist, um alle Werte aufzunehmen im Feld aufzunehmen. Für TINYINT, SMALLINT, MEDIUMINT, INT und BIGINT sind die Feldbreiten die Feldbreiten 4, 6, 8, 11 und 20, unabhängig davon, was der deklarierte Anzeigebreite ist.

L Zeilen zu trennen. Wenn eine Zeile nicht nicht alle Felder enthält, werden die restlichen Spalten auf ihre Standardwerte gesetzt Werte gesetzt. Wenn Sie keinen Zeilen Terminator haben, sollten Sie diesen auf '' setzen. In diesem Fall muss die Textdatei alle Felder für jede Zeile enthalten.

F o Hinweis t funktionieren, wenn Sie einen Multi-Byte-Zeichensatz verwenden Zeichensatz .


NULL-Behandlung

W w ENCLOSED BY beide leer sind), wird NULL als eine leere Zeichenkette geschrieben. Beachten Sie, dass dies dazu führt, dass sowohl NULL-Werte als auch leere Strings in der Tabelle zu sein ununterscheidbar sind, wenn sie in die Datei geschrieben werden, da beide als leere Zeichenfolgen geschrieben werden. Wenn Sie in der Lage sein müssen zu unterscheiden, wenn Sie die Datei Datei wieder einlesen, sollten Sie nicht das Format mit festen Zeilen verwenden.


S DATA INFILE NICHT UNTERSTÜTZT:

  • Zeilen mit fester Größe (FIELDS TERMINATED BY und FIELDS ENCLOSED BY beide leer) und BLOB- oder TEXT-Spalten.

  • U Laden von Daten mit festem Zeilenformat verwendet werden, da Benutzervariablen keine Anzeigebreite haben.

1voto

Jonathan Leffler Punkte 694013

Wahrscheinlich wird es Ihnen nicht besonders gefallen, aber es gibt wirklich keinen einfachen Weg, das zu erreichen, was Sie wollen. Vor langer Zeit (ca. 1991) schrieb ich ein Tool, DBLDFMT (für 'database load format'), um mit solchen Dateien fester Länge und ohne Begrenzung umzugehen. Es ist darauf abgestimmt, das von Informix-Datenbanken bevorzugte Ladeformat zu erzeugen (es verwendet also standardmäßig ein Pipe-Symbol, um die Felder zu trennen, aber natürlich kann man das mit einer Kommandozeilenoption oder einer Umgebungsvariablen einstellen). Es kann jedoch auch durch Trennzeichen getrennte Daten erzeugen, die Sie dann ganz normal verarbeiten können, wahrscheinlich mit der DATEN IN DATEI LADEN mando.

Kontaktieren Sie mich per E-Mail (siehe mein Profil), wenn Sie den Quellcode für DBLDFMT benötigen. (Die aktuelle Version, 3.17 von 2008, hat keine direkte Unterstützung für die CSV-Ausgabe. Es wäre aber nicht schwer, sie hinzuzufügen. Sie können, mehr oder weniger, den gewünschten Effekt erzielen, aber es sollte viel einfacher sein als es ist).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X