csv. Datei mit Komma lässt sich nicht einlesen

Mr. Robot

Fleissiger Benutzer
Beiträge
88
Hallo zusammen,

ich habe eine .csv Datei die ich mit einem BULK INSERT einlesen möchte.

Vorher erstelle ich die Tabelle wie folgt:

CREATE TABLE NAME (
[Betrag] FLOAT NOT NULL
usw.
)

Betrag ist eine Komma Zahl. Aber bei der Zuordnung Float gibt es eine Fehlermeldung. Ich habe noch 50 weitere Spalten mit Komma Einträge und möchte ungerne alles als VARCHAR einlesen und später mit REPLACE anpassen. Gibt es hier eine Möglichkeit das bei CREATE gleich richtig umzusetzen?

Danke & Gruß
 
Werbung:
Liegt es am Komma? Ändere dies einmal bei einem auf Punkt.



FORMATFILE = 'format_file_path'​

Specifies the full path of a format file. A format file describes the data file that contains stored responses created by using the bcp utility on the same table or view. The format file should be used if:
  • The data file contains greater or fewer columns than the table or view.
  • The columns are in a different order.
  • The column delimiters vary.
  • There are other changes in the data format. Format files are typically created by using the bcp utility and modified with a text editor as needed. For more information, see bcp Utility and Create a format file
 
Also BULK kann leider keine Daten "on the fly" konvertieren. Und das Format der CSV-Datei ist ja weniger das Problem als das er ein Komma in einer Zeichenkette nicht als Dezimaltrennzeichen betrachtet. Vermutlich geht das höchstens über irgendwelche kruden Ländereinstellungen.

Welche MSSQL Version hat deine DB?
 
Version 15.0.18206.0

Was genau hat das denn mit dem

FORMATFILE = 'format_file_path'​

auf sich? Wie genau müsste der Befehl in der with Klausel erfolgen?
 
Es gibt entsprechende Beispiele:

Du hast wohl ein Format Problem. Daher hilft es nicht beim Anlegen der Tabelle etwas zu machen, sondern beim Insert.
Hier musst du aber wohl ein Formatfile anlegen, welches Zeichen als Float Trenner gilt.
 
Wie müsste denn der Formatfile Befehl konkret eingebaut werden? Mein BULK INSERT sieht aktuell wie folgt aus:

BULK INSERT Tabellen_Name
FROM 'XXX.csv'
WITH
(
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
FIRSTROW = 2
)
 
BULK INSERT Tabellen_Name
FROM 'XXX.csv'
WITH
(
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
FORMATFILE = 'dein_format_file',
FIRSTROW = 2
)
 
Muss das nicht eher ein Path sein? FORMATFILE = 'format_file_path'

Wenn ich
FORMATFILE = 'XXX.csv'
setze klappt es zumindest nicht. Muss ich da noch etwas zusätzlichen erstellen? 🤯
 
Ich würde sagen Pfad + Dateiname. Außerdem muss der ausführende Benutzer Leserechte auf dem Pfad haben.
 
Fehlermeldung:
Massenladen ist nicht möglich. Die Datei "XXX" ist nicht vorhanden.

Ich denke man muss schon .csv am Ende eingeben. Aber richtig ist es dennoch nicht.
 
ich glaube, für FORMATFILE wird man eine Datei brauchen, die das Eingabeformat spezifiziert, und keine CSV, aus denen Daten eingelesen werden sollen. Die kommen ja von dem, was BULK INSERT ... FROM ... spezifiziert.

Aber was weiß ich schon von M$SQL ...
 
Ich halte das irgendwie für selbstverständlich, das FORMATFILE eine Datei (als vollständigen Pfad) benennt in dem das Format der zu importierenden Datei spezifiziert wird. Ich hatte mir den Link von @Dukel natürlich nicht angesehen, der geht da tatsächlich nicht weiter drauf ein aber Herrgott, es gibt ja Google oder nicht?
Das Format der FORMATFILE kann offensichtlich nicht nur XML sein, das würde ich jetzt aber empfehlen. Welche Dateiendung die FORMATFILE dann hat, ob csv, txt oder xml oder auch gar keine ist vermutlich völlig egal. Aber natürlich: FORMATFILE ist kein zu importierender Datensatz sondern eine den Aufbau der zu importierenden Daten beschreibende Datei. Vermutlich muss die erst noch erstellt werden, theoretisch könnte aber auch das System aus dem die Daten stammen, die Datei liefern.
 
Ich habe noch an anderer Stelle gelesen, das es in MSSQL für diesen Fall den Befehl
FORMAT = 'CSV'
gibt. Allerdings bekomme ich immer die Fehlermeldung:

Falsche Syntax in der Nähe von "FORMAT"

BULK INSERT Tabellen_Name
FROM 'XXX.csv'
WITH
(
FORMAT = 'CSV',
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
FIRSTROW = 2
)

Habe die neuste Version des Management Studios. Jemand eine Idee warum das dennoch nicht klappt?
 
Werbung:
Ist eventuell nur dein SSMS auf Version 15.0.18206.0, das DBMS aber prä 2017?

Input file format options​

FORMAT = 'CSV'​

Applies to: SQL Server 2017 (14.x).

Specifies a comma-separated values file compliant to the RFC 4180 standard.
Das ist ein Syntax-Fehler, deine Import-Datei ist also (erstmal) nicht das Problem. Aber abgesehen davon liegt denn wirklich RFC4180 vor? CSV ist kein einheitlicher Standard sondern wird sehr allgemein verwendet.
 
Zurück
Oben