Textdatei in MySQL-Datenbank importieren. Trennung funktioniert nicht korrekt

Steffen S

Neuer Benutzer
Beiträge
4
Hallo zusammen,

ich möchte in eine MySQL-Datenbank eine Textdatei mit folgendem Aufbau importieren.

[{"BaustelleIdent":"ae08e943-2306-467d-8141-72bb93c5cb3a","NachunternehmerIdent":"3d6966da-9a34-481f-9606-55aeaa119760","BauteilIdent":null usw. usw. }]

Die Spalten sollen dabei "BaustellenIdent", "NachunternehmerIdent" etc. sein.

in den Zeilen sollen dann jeweils die Daten nach den Doppelpunkten stehen

In MySQL habe ich es mit dem Importassistenten versucht. Hier habe ich als Flatdateiquellel die .txt Datei angegeben.

Hier muss ich zunächst das Kopfzeilentrennzeichen definieren und später das Zeilentrennzeichen und das Spaltentrennzeichen.

Ich habe dutzende Varianten ausprobiert, aber keine führt zu dem gewünschten Ergebnis.

Kann mir hier jemand helfen?

Vielen Dank im Voraus! :)


Habe das Ganze auch schon einmal bei "gutefrage.net" angebracht, bevor jemand doppelt antworten würde...:

Textdatei in MySQL-Datenbank importieren. Trennung funktioniert nicht korrekt.? (Import, sql datenbank, trennzeichen)
 
Werbung:
Das sind JSON-Daten, richtig? Was willst Du später damit machen? Drin suchen? Das kann MySQL nicht.

So würde es in PG gehen, da kannst dann indexbasiert in den JSON-Daten auch suchen etc.:

Code:
test=# create table steffen(id int primary key, data jsonb);
CREATE TABLE
test=*# insert into steffen values (1, '{"BaustelleIdent":"ae08e943-2306-467d-8141-72bb93c5cb3a","NachunternehmerIdent":"3d6966da-9a34-481f-9606-55aeaa119760","BauteilIdent":null }');
INSERT 0 1
test=*# create index on steffen using gin(data jsonb_path_ops);
CREATE INDEX
test=*# explain select * from steffen where data @>  '{"NachunternehmerIdent": "3d6966da-9a34-481f-9606-55aeaa119760"}';
  QUERY PLAN   
-----------------------------------------------------------------------------------------------
 Seq Scan on steffen  (cost=0.00..1.01 rows=1 width=36)
  Filter: (data @> '{"NachunternehmerIdent": "3d6966da-9a34-481f-9606-55aeaa119760"}'::jsonb)
(2 rows)

test=*# set enable_seqscan to off;
SET
test=*# explain select * from steffen where data @>  '{"NachunternehmerIdent": "3d6966da-9a34-481f-9606-55aeaa119760"}';
  QUERY PLAN   
---------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on steffen  (cost=8.00..12.01 rows=1 width=36)
  Recheck Cond: (data @> '{"NachunternehmerIdent": "3d6966da-9a34-481f-9606-55aeaa119760"}'::jsonb)
  ->  Bitmap Index Scan on steffen_data_idx  (cost=0.00..8.00 rows=1 width=0)
  Index Cond: (data @> '{"NachunternehmerIdent": "3d6966da-9a34-481f-9606-55aeaa119760"}'::jsonb)
(4 rows)

(ich hab seqscan's verboten, damit der Planner den Index trotz der dafür eigentlich zu wenigen Daten nutzt)
 
Nachtrag:

Damit geht dann auch z.B. sowas:

Code:
test=*# select * from jsonb_each_text((select data from steffen where id = 1)) ;
  key  |  value   
----------------------+--------------------------------------
 BauteilIdent  |
 BaustelleIdent  | ae08e943-2306-467d-8141-72bb93c5cb3a
 NachunternehmerIdent | 3d6966da-9a34-481f-9606-55aeaa119760
(3 rows)
 
Also auf die Daten greife ich über den Webbrowser auf die API eines Dienstleisters zu, bei dem Daten gespeichert sind.
Diese will ich in eine Tabelle in SQL übertragen um daraus später Abfragen machen zu können.

Ziel soll es letztendlich mal sein, dass die Daten automatisch von der Website heruntergeladen und gespeichert werden und dann immer wieder automatisch die Daten in der Datenbank aktualisieren.

Diese Daten will ich dann später abrufen können, bzw. hier mit Verknüpfungen und Summenfunktionen arbeiten können.

Bin leider ziemlicher Anfänger in Sachen Datenbanken aber für Excel ist die Datenmenge einfach viel zu groß. Das wird zu unperformant, bzw. ist Excel da auch schnell von der Kapazität am Ende.

Kannst du mir kurz erklären, wieso ich da später nicht drin suchen kann? Kann man dort nicht mit SELECT und WHERE suchen?
In anderen Tabellen geht das ja auch wenn ich z. B. eine Excel importiere. Evtl. habe ich aber auch hier Begriffe vertauscht, also ich nutze "SQL Express 2014"
 
Du kannst da maximal mit LIKE und Co drin suchen, aber nicht wirklich indexbasiert und nicht im Sinne eine Suche in einem JSON-Dokument, was aus Key-Value - Paaren besteht. In MySQL ist das nur ein einfacher Text, die Key-Value-Struktur ist für MySQL eine Blackbox.

PostgreSQL hat einen extra Datentyp für JSON-Daten: JSON halt, bzw. JSONB, welches JSON-Daten in einer binären Struktur speichert und somit auch Indexe auf diese Key-Value-Struktur anbietet.

Du wirst Dir mit MySQL da die Finger brechen...
 
Dann wird das Ganze ja doch etwas komplizierter als Gedacht :(
Also ich nutze wie gesagt SQL Express 2014. Ich weiß nicht, ob das noch einen Unterschied zu MYSQL macht?
Wenn nicht, dann muss ich mir mal überlegen, was ich mache.....Dachte halt ich könnte die Daten ganz normal in eine saubere Tabelle einlesen und dann von dort aus auswerten.
 
Also bis dahin warten. In der Zwischenzeit kann man ja PostgreSQL nutzen - das kann das schon seit einigen Jahren ;-)
 
Werbung:
Zunächst einmal sollte der Import ja klappen und je nach Anwendungsfall ist JSON Support ja nicht das riesen Problem ;) So wie ich das sehe sind alle deine Zeilen identisch aufgebaut?

Wenn du MSSQL und nicht MySQL nutzt musst du mit einer komplett anderen Syntax beim Import arbeiten. Bei SQL Express kannst du zwar irgend so ein Import Wizzard verwenden basierend auf SISS oder so aber meines Wissens nach kann die Express Lizenz keine Importe automatisieren oder speichern. Daher würde ich zunächst mal mit BCP importieren. Das ist zwar etwas frickelig, kann aber viel.
Code:
BULK INSERT tabelle
FROM   'd:\Pfad\Datei.txt'
WITH (FIELDTERMINATOR = '","');
Sollte dir erstmal die Daten in die Tabelle knallen, vermutlich in dem Format:
Spalte1: [{"BaustelleIdent":"ae08e943-2306-467d-8141-72bb93c5cb3a
Spalte2: NachunternehmerIdent":"3d6966da-9a34-481f-9606-55aeaa119760
Spalte3: BauteilIdent":null
Also alle Spalten als VARCHAR(), ich würde also erstmal eine Importtabelle vorschalten. Danach kann man sich die Infos daraus lesen und in das richtige Format bringen.
 
Zurück
Oben