Eine CSV-Datei für INSERT INTO vorbereiten (Linux Mint) - einach so.

Forum für neue Firebird-Anwender.

Moderator: thorben.braun

Antworten
Gerd
Beiträge: 234
Registriert: Di 1. Okt 2019, 17:13

Hallo.

Die Aufgabe:
Ich habe mir die Aufgabe gestellt zwei (fremde) CSV-Dateien (3 Zeilen und 84.694 Zeilen) mit dem Linux Mint Editor xed (v3.2.2) in eine jeweils zuvor erstellte DB-Tabelle TEST zu laden.
Die CSV-Dateien sollen unter Verwendung von regulären Ausdrücken (xed Dialog "Suchen und Ersetzen") entsprechend überprüft und vorbereitet werden.
Abschließend soll unter Verwendung des Terminals (v3.36.2) und Firebirds ISQL-Tool (LI-V4.0.1.2696) der Datentransfer stattfinden.



Die Datenquelle(n):
Der Zeitaufwand für die sorgfältige Prüfung einer (fremden) CSV-Datenquelle auf 'Fehlerfreiheit' lohnt sich eigentlich immer. Es könnten z.B. typographisch unkorrekte Apostrophe (Deppenapostrophe) sein, die einem den angestoßenen CSV-Import verhageln. Auch akademische Datenquellen sollten davon keine Ausnahme bilden, wie ich feststellen durfte.


Original CSV-Datei (3 Zeilen):

Code: Alles auswählen

'4','2021-02-27 18:59:31.0','true','04',''
'5','2021-02-27 19:07:10.0','false','04',''
'6','2021-03-03 14:13:19.0','true','04',''
1. Schritt:

Suchen nach: ^(.+)$
Ersetzen durch: INSERT INTO TEST values (\1

Code: Alles auswählen

INSERT INTO TEST values ('4','2021-02-27 18:59:31.0','true','04',''
INSERT INTO TEST values ('5','2021-02-27 19:07:10.0','false','04',''
INSERT INTO TEST values ('6','2021-03-03 14:13:19.0','true','04','
2. Schritt:

Suchen nach: ^(.+)$
Ersetzen durch: \1);

Code: Alles auswählen

INSERT INTO TEST values ('4','2021-02-27 18:59:31.0','true','04','');
INSERT INTO TEST values ('5','2021-02-27 19:07:10.0','false','04','');
INSERT INTO TEST values ('6','2021-03-03 14:13:19.0','true','04','');
* * *

Ein anderes Beispiel:


Original CSV-Datei (84.694 Zeilen):

Code: Alles auswählen

'0','64113','1','','','','','Toddler's fracture - kodiere Fraktur nach Lokalisation'
1. Schritt:
Mit xed die CSV-Datei prüfen.
Suchen nach: Umschalt+#'
Treffer. Typografisch korrekte Apostrophe zuweisen.
Ersetzen durch: ALTGR+#'

Ergebnis:

Code: Alles auswählen

'0','64113','1','','','','','Toddler’s fracture - kodiere Fraktur nach Lokalisation'
2. Schritt:
Suchen nach: ^(.+)$
Ersetzen durch: INSERT INTO TEST values (\1

Ergebnis:

Code: Alles auswählen

INSERT INTO TEST values ('0','64113','1','','','','','Toddler’s fracture - kodiere Fraktur nach Lokalisation'
3. Schritt:
Suchen nach: ^(.+)$
Ersetzen durch: \1);

Ergebnis:

Code: Alles auswählen

INSERT INTO TEST values ('0','64113','1','','','','','Toddler’s fracture - kodiere Fraktur nach Lokalisation');

Der Ablauf:
Die beiden CSV-Dateien sind mit xed überprüft, mit wenig Aufwand bearbeitet und importfähig.
Die zwei DB-Tabellen (hier jeweils: "TEST") sind in den Datenbanken bereits angelegt.
Die Verbindung zur jeweiligen Datenbank (z.B. zeit.fdb) ist mittels Firebird ISQL Tool hergestellt.

Jetzt können die Inhalte der jeweiligen final bearbeiteten CSV-Dateien kopiert und in das ISQL-Terminal eingefügt werden.
Die INSERTS (die Verarbeitung) von bspw. 84.694 Datensätzen dauert bei dieser Herangehensweise etwa 15 Sekunden.



Alternativ kann der Datentransfer auch mittels Script (*.sh) umgesetzt werden - wie folgt:

Mit dem Editor xed die jeweilige CSV-Datei als z. B. "insert_zeit.sql" (es ginge auch "insert_zeit.txt) abspeichern.

Ihr Inhalt dem ersten Beispiel folgend wäre:

Code: Alles auswählen

INSERT INTO TEST values ('7','2022-03-03 14:13:19.0','true','04','');
Mit dem Editor xed eine Script-Datei bspw. "insert_test.sh" anlegen.

Deren Inhalt:

Code: Alles auswählen

isql /home/gerd/Firebird/Datenbanken/zeit.fdb -u sysdba -p geheimes_passwort -i /home/gerd/Firebird/FB-SQL/insert_zeit.sql
Jetzt das Terminal aufrufen und zum Speicherort der Script-Datei "insert_test.sh" gehen.
Eingabe: ./insert_test.sh
So sieht das aus:

Code: Alles auswählen

gerd@gerd-MS-7641:~/Firebird/FB-Skripte$ ./insert_test.sh
Und so werden auf diese Weise z. B. 84.694 Datensätze in die DB-Tabelle TEST eingefügt.

Hoffe, es nutzt jemanden. Ich gehe einfach davon aus, dass schnelle Erfolgserlebnisse bei Einsteigern (privat / geschäftlich) oder Gelegenheitsnutzern der Popularität von Firebird nur förderlich sein können.
Die 'Flüssigkeit' während der Bearbeitung in xed kommt sicher an ihre Grenzen - vermutlich so bei ca. 150.000 Zeilen.
Falls man nur vorhat Firebird 4 zu prüfen, dann muss man nicht erst nach Tools von Drittanbietern suchen.
Ob sich tatsächlich jede CSV-Datei so bearbeiten und für Firebird vorbereiten lässt, kann ich nicht mit Bestimmtheit sagen.


Viele Grüße
Gerd
Linux Mint 21.3 Virginia Cinnamon 6.0.4
Firebird 5.0.0., Embedded, ISQL: LI-V5.0.0.1306
Lazarus 3.0.0 - FPC 3.2.2
bfuerchau
Beiträge: 484
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Dafür benutze ich einfach mein eigenes Tool "FTIS.Connect".
Von jeder ODBC/OLEBD-Datenbank in jede ODBC/OLEDB-Datenbank.
Für CSV nehme ich die Standard Office-Treiber.
Antworten