INSERT from CSV

DaRealMC

Erfahrenes Mitglied
Ich habe eine CSV-Datei, die mit normalen Kommas getrennt wurde und einzelne Zeilen haben in einem gewissen Feld ein eigenes Komma und deshalb sin sie mir Anführungszeichen umschlossen.
Als ich alle Spalten auf Text stehen hatte, hat folgendes Query geklappt:
Code:
BULK
INSERT Logs2
FROM 'd:\tmp2\log_web1_1_0.csv'
WITH
(
FIELDTERMINATOR = ',',
FIRSTROW = 2,
ROWTERMINATOR = '\n'
)
Jedoch war die Tabelle am Ende 10mal so groß wie die CSV-Datei

Ich habe jetzt eine neue Tabelle angelegt
Code:
CREATE TABLE dbo.Tmp_Logs2
	(
	date nvarchar(10) NULL,
	time nvarchar(8) NULL,
	[s-sitename] nvarchar(20) NULL,
	[cs-uri-stem] nvarchar(50) NULL,
	[cs-uri-query] nvarchar(200) NULL,
	[c-ip] nvarchar(15) NULL,
	[cs(User-Agent)] nvarchar(512) NULL,
	[sc-status] int NULL
	)

Leider klappt aber der Import jetzt nicht mehr
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 1004073, column 8 (sc-status)

Schaue ich mir die entsprechende Zeile an,
2009-10-01,00:42:38,W3SVC123456789,/index.php,arg1=1,bla.bla.bla.bla,"Mozilla/5.0+(compatible;+DotBot/1.1;+http://www.dotnetdotcom.org/,+crawler@dotnetdotcom.org)",301
stimmt aber der letzte Wert: Es ist ein Int.
ABER: Spalte 7 wird von Anführungszeichen umgeben und enthält im eigenen Text Kommas.

Wie kann ich die CSV dennoch fehlerfrei importieren?
 
Gut, dann soll sich jemand anderes drum kümmern. Ich kann nur (MS Access), MySQL und Oracle mit PL/SQL.

Viel Glück
 
Moin DaRealMC,

tja, Zusatzaufwand wirst du jetzt so oder so haben - du kannst nur noch überlegen, an welcher Stelle das für dich am vertretbarsten wäre..

a) Entweder du änderst das "Layout" bzw den Inhalt der .csv-Datei. Wenn das aber eine von wem auch immer erzeugte Logdatei ist, dann hast du unter Umständen wenig Einfluss darauf.
Wenn doch---> dann ALLE Werte in Anführungszeichen UND mit Komma getrennt schreiben.
[ Beispiel: "2009-10-01","00:42:38","W3SVC123456789","/index.php","arg1=1","bla.bla.bla.bla", ..]
Dann kannst du sagen.... WITH (FIELDTERMINATOR = '","')
Oder aber- wenn das unproblematischer ist--> nimm doch als FIELDTERMINATOR ein Semikolon.

b) oder du lässt die csv-Datei as is, sagst "DATAFILETYPE = 'char' ", und importierst (im ersten Step) in eine Tabelle, die auch nur varchar/nChar/Char-Felder hat.
Und aus dieser heraus mit den üblichen Typkonvertierungsfunktionen in eine endgültige Tabelle nach obigem Muster mit "INSERT INTo FinalTab SELECT felda, ...convert(Feldx)...From ImportTab".

Grüße
Biber
 
hmmm.. Danke für die Antwort

Das kann lustig werden... es geht hier nämlich um die Logfiles unsrer Webserver. 35GB/Monat steigend...

Muss ich mal schauen, ob ich im LogParser irgendwo das Trennzeichen beeibflussen kann.
 
[OT]
Moin DaRealMC,

tut mir Leid, aber
1) du hast danach gefragt
2) ich bin nur der Bote
;-)

Grüße
Biber
[/OT]
 
Zurück