Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

CSV-Datei in Tabelle einlesen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Nobody, 26 Juli 2013.

  1. Nobody

    Nobody Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Innerhalb ein und derselben Datei?

    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 ...
     
  3. Nobody

    Nobody Benutzer

    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.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Klingt nach leckerem Datensalat.


    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.
     
  5. Nobody

    Nobody Benutzer

    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.
     
  6. ukulele

    ukulele Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden