CSV-Datei in Tabelle einlesen

Nobody

Benutzer
Beiträge
7
Hallo,

Ich muss eine CSV-Datei in eine Tabelle einlesen. Ich weiß aber den Aufbau der CSV-Datei nicht (Sie kann mal 10 Spalten und ein andermal 20 Spalten haben, wird aber nie mehr als 50 Spalten haben und pro Spalte kann die Zeichensatzlänge mal 10 oder 60 Zeichen sein).

Die dazu gehörige Tabelle hat 51 Spalten, wobei die 1. Spalte als Integer definiert ist und beim Import nicht beschrieben werden darf. Alle anderen 50 Spalten sind als char(50) definiert.

Ich habe das ganze schon mit
Code:
BULK INSERT 
gehasdat
from 'c:\Artikel.csv'
WITH
(
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = '\n'
)
versucht, aber hierbei wird auch die 1. Spalte der Tabelle beschrieben und bekomme somit eine Fehlermeldung weil ich einen Text in eine Integer Variable schreiben will. Desweiteren wird mein Zeilenende mit '\n' oder '\r\n' nicht erkannt. Auch wenn ich in die CSV Datei ein '$' an das Ende jeder Zeile schreibe findet SQL das Zeilenende nicht.

Anschließend habe ich es mit
Code:
insert into gehasdat
(FELD_1,FELD_2,FELD_3-FELD_50)
select
FELD_1,FELD_2,FELD_3-FELD_50
from OPENROWSET(BULK N'c:\Artikel.csv'
        ,FORMATFILE = N'C:\Artikel.dat'
        ,CODEPAGE  = 'RAW') AS T1
versucht. Hierbei bekomme ich die Fehlermeldung
"Meldung 4863, Ebene 16, Status 1, Zeile 1
Datenkonvertierungsfehler (Abschneiden) beim Massenladen für 1-Zeile, 1-Spalte (FELD_1)."

Keine Ahnung was ich noch machen soll. Vielleicht habt ihr noch eine Möglichkeit eine CSV-Datei in eine SQL-Tabelle, wenn der Aufbau der CSV-Datei nicht bekannt ist.

Gruß Nobody
 
Werbung:
Hallo,

Ich muss eine CSV-Datei in eine Tabelle einlesen. Ich weiß aber den Aufbau der CSV-Datei nicht (Sie kann mal 10 Spalten und ein andermal 20 Spalten haben, wird aber nie mehr als 50 Spalten haben und pro Spalte kann die Zeichensatzlänge mal 10 oder 60 Zeichen sein).

Innerhalb ein und derselben Datei?

Keine Ahnung was ich noch machen soll. Vielleicht habt ihr noch eine Möglichkeit eine CSV-Datei in eine SQL-Tabelle, wenn der Aufbau der CSV-Datei nicht bekannt ist.

Gruß Nobody

Woher kommt die Information, welche der fehlenden Felder wo sind? Also, Deine Zieltabelle hat 51 Spalten, das CSV aber nur 20. Fehlen da mitten drin Werte, vorne, hinten?


Ich würd ja sagen, bring Deine CSV in Ordnung ...
 
Hallo akretschmer,

Nein innerhalb einer CSV-Datei ist die Spaltenanzahl gleich. Aber verschiedene CSV-Dateien können verschieden viele Spalten beinhalten.

Die CSV-Datei sind Artikellisten von Lieferanten. Da die Lieferanten die CSV-Datei nach Ihren Vorlieben aufbauen, kann es sein das die eine Datei mehr Spalten hat als die andere.

Wenn die CSV-Datei nur 20 Spalten hat, dann hat diese auch nur 20 Spalten, es sind also nicht nur 20 Spalten beschrieben.

Ich muss auch nicht wissen, was in welcher Spalte drin ist, ich gehe einfach davon aus dass in jeder Spalte irgendwelche Zeichen sind, da ich diese eh in char(50) einlese.

Die CSV-Datei könnte ich in Ordnung bringen, aber wie mache ich dass ich die Datei einlese aber die erste Spalte in meiner Tabelle nicht beschrieben wird.

Mit einer Formatdatei habe ich das schon versucht, aber in dieser muss ich die Anzahl der Spalten angeben und die kann ja bei mir variieren.
 
Hallo akretschmer,

Nein innerhalb einer CSV-Datei ist die Spaltenanzahl gleich. Aber verschiedene CSV-Dateien können verschieden viele Spalten beinhalten.

Die CSV-Datei sind Artikellisten von Lieferanten. Da die Lieferanten die CSV-Datei nach Ihren Vorlieben aufbauen, kann es sein das die eine Datei mehr Spalten hat als die andere.

Klingt nach leckerem Datensalat.

Die CSV-Datei könnte ich in Ordnung bringen, aber wie mache ich dass ich die Datei einlese aber die erste Spalte in meiner Tabelle nicht beschrieben wird.

Mit einer Formatdatei habe ich das schon versucht, aber in dieser muss ich die Anzahl der Spalten angeben und die kann ja bei mir variieren.


Code:
test=# create table nobody(col1 text, col2 text, col3 text);
CREATE TABLE
test=*# commit;
COMMIT
test=*# \!
[root@akretschmer ~]# echo "text2,text3" > /tmp/val.csv
[root@akretschmer ~]# exit
test=*# copy nobody (col2, col3) from '/tmp/val.csv' delimiter ',';
COPY 1
test=*# select * from nobody ;
 col1 | col2  | col3
------+-------+-------
      | text2 | text3
(1 row)

Also, so geht es in PG, man nennt beim COPY-Befehl die Spalten, die gefüllt werden sollen. Von M$SQL hab ich keine Ahnung ... aber vielleicht gibt es da ähnliche Wege.
 
Wie sowas in SQL geht weiß ich eben nicht, aber trotzdem schon mal Danke für eine Antworten.

Vielleicht hat ja noch ein anderer eine Idee.

Es würde mir auch helfen, wenn ich wüsste wie ich in SQL eine Datei Zeilenweise auslesen kann und mir den Import dann selber schreibe.
 
Werbung:
Leider kann ich da jetzt nicht viel zu beisteuern weil das doch etwas intensiver getestet werden müsste. Ich würde sagen es gibt nur einen Weg und zwar ein dynamisches SQL Statement. Du ließt per BULK Import die erste Zeile deiner CSV Datei aus und zählst die Spalten (bzw. die Trennzeichen + 1), Dann baust du eine WHILE Schleife die den eigentlichen Select zusammen baut und zwar mit der exakten Spaltenanzahl "INSERT INTO tabelle VALUES (..." und beim CSV Select. Danach führst du das ganze mit EXEC() aus.
 
Zurück
Oben