Benutzer mit den meisten Antworten
CSV in Tabelle einlesen

Frage
-
Hallo zusammen,
ich habe mal wieder eine Frage (was den sonst :-) ):
Zur Auswertung muss ich Daten aus einer Textdatei in eine SQL-Tabelle einlesen. Über die Hilfe bin ich auf die Funktion "BULK INSERT" gestossen, nur schaffe ich es nicht, die Textdatei ohne manuelle Bearbeitung einzulesen.
Die Textdatei ist eine CsvDelimited-Datei, der Zeilenaufbau ist:
"Das ist das erste Feld";"Das ist das zweite Feld";"19.07.2011 06:30:15";"und so weiter"Mir ist nicht ganz klar, wie ich BULK INSERT überreden kann die Hochkommas zu erkennen. Setze ich FIELDTERMINATOR auf '";"' erkennt er das erste und letzte Hochkomma nicht. Die Abgrenzung selber brauche ich da im Textfile innerhalb eines Feldes auch der StrichPunkt vorkommt und so bleiben muss.
Auch habe ich gesehen das OPENROWSET empfohlen wird, nur das klappt auch nicht.
Könntet Ihr mir bitte sagen wie ich das lösen kann? Kann man auch beim einlesen schon das Datum wie im File übernehmen?
Ach ja, kann man eigentlich auch ein fortlaufender Zähler in die Tabelle einbauen? Ist nicht wichtig, wäre aber interessant um zu sehen welche Zeile bei gleichem Wert als erstes in der Datei stand.
Viele Grüsse und Dank im vroaus,
Maximilian
Antworten
-
Hallo Maximilian,
wie Stefan bereits schrieb funktioniert es mit openrowset. Aber auch mit Bulk Insert sehe ich da keine Probleme. Das Datum kannst Du leider in dieser Form nicht als Datetime-Feld übernehmen, da hier die Hochkomas stören und es zu Meldung falscher Datentyp kommen wird. Einen fortlaufenden Zähler würde ich in der Form einbauen, das ich die erste Spalte ID nennen würde und diese als Integer mit Identity definieren würde. Das sieht dann also wie folgt aus:
USE [Test] GO /****** Object: Table [dbo].[TestFormat] Script Date: 07/21/2011 15:57:43 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[TestFormat]( [ID] [int] IDENTITY(1,1) NOT NULL, [Col1] [nvarchar](max) NULL, [Col2] [nvarchar](max) NULL, [Col3] [nvarchar](max) NULL, [Col4] [nvarchar](max) NULL ) ON [PRIMARY] GO BULK INSERT dbo.TestFormat FROM 'C:\Test\Daten.csv' WITH (FORMATFILE = 'C:\Test\Format.fmt'); GO
Meine Formatdatei sieht dann wie folgt aus:10.0
4
1 SQLCHAR 0 100 ";" 2 Col1 SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 100 ";" 3 Col2 SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 100 ";" 4 Col3 SQL_Latin1_General_CP1_CI_AS
4 SQLCHAR 0 100 "\r\n" 5 Col4 SQL_Latin1_General_CP1_CI_ASSolltest Du anschl. noch die Hochkommata laswerden wollen, kannst Du folgendes Script über die Tabelle laufen lassen.
UPDATE dbo.TestFormat SET Col1 = REPLACE(Col1, '"', ''), Col2 = REPLACE(Col2, '"', ''), Col3 = REPLACE(Col3, '"', ''), Col4 = REPLACE(Col4, '"', '') GO
Gruß Falk
- Als Antwort vorgeschlagen Stefan FalzModerator Freitag, 22. Juli 2011 21:02
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 3. August 2011 17:20
-
Mit OPENROWSET:
SELECT * FROM OPENROWSET(BULK 'C:\Temp\Test.txt', FORMATFILE= 'C:\Temp\Test.fmt') T ;
10.0 4 1 SQLCHAR 0 32 ";" 1 Col1 SQL_Latin1_General_CP1_CI_AS 2 SQLCHAR 0 32 ";" 2 Col2 SQL_Latin1_General_CP1_CI_AS 3 SQLCHAR 0 32 ";" 3 Col3 SQL_Latin1_General_CP1_CI_AS 4 SQLCHAR 0 32 "\r\n" 4 Col4 SQL_Latin1_General_CP1_CI_AS
Am Ende der Formatdatei muss eine Leerzeile stehen.
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann- Als Antwort vorgeschlagen Stefan FalzModerator Freitag, 22. Juli 2011 21:02
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 3. August 2011 17:20
Alle Antworten
-
Mit OPENROWSET:
SELECT * FROM OPENROWSET(BULK 'C:\Temp\Test.txt', FORMATFILE= 'C:\Temp\Test.fmt') T ;
10.0 4 1 SQLCHAR 0 32 ";" 1 Col1 SQL_Latin1_General_CP1_CI_AS 2 SQLCHAR 0 32 ";" 2 Col2 SQL_Latin1_General_CP1_CI_AS 3 SQLCHAR 0 32 ";" 3 Col3 SQL_Latin1_General_CP1_CI_AS 4 SQLCHAR 0 32 "\r\n" 4 Col4 SQL_Latin1_General_CP1_CI_AS
Am Ende der Formatdatei muss eine Leerzeile stehen.
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann- Als Antwort vorgeschlagen Stefan FalzModerator Freitag, 22. Juli 2011 21:02
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 3. August 2011 17:20
-
Hallo Maximilian,
wie Stefan bereits schrieb funktioniert es mit openrowset. Aber auch mit Bulk Insert sehe ich da keine Probleme. Das Datum kannst Du leider in dieser Form nicht als Datetime-Feld übernehmen, da hier die Hochkomas stören und es zu Meldung falscher Datentyp kommen wird. Einen fortlaufenden Zähler würde ich in der Form einbauen, das ich die erste Spalte ID nennen würde und diese als Integer mit Identity definieren würde. Das sieht dann also wie folgt aus:
USE [Test] GO /****** Object: Table [dbo].[TestFormat] Script Date: 07/21/2011 15:57:43 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[TestFormat]( [ID] [int] IDENTITY(1,1) NOT NULL, [Col1] [nvarchar](max) NULL, [Col2] [nvarchar](max) NULL, [Col3] [nvarchar](max) NULL, [Col4] [nvarchar](max) NULL ) ON [PRIMARY] GO BULK INSERT dbo.TestFormat FROM 'C:\Test\Daten.csv' WITH (FORMATFILE = 'C:\Test\Format.fmt'); GO
Meine Formatdatei sieht dann wie folgt aus:10.0
4
1 SQLCHAR 0 100 ";" 2 Col1 SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 100 ";" 3 Col2 SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 100 ";" 4 Col3 SQL_Latin1_General_CP1_CI_AS
4 SQLCHAR 0 100 "\r\n" 5 Col4 SQL_Latin1_General_CP1_CI_ASSolltest Du anschl. noch die Hochkommata laswerden wollen, kannst Du folgendes Script über die Tabelle laufen lassen.
UPDATE dbo.TestFormat SET Col1 = REPLACE(Col1, '"', ''), Col2 = REPLACE(Col2, '"', ''), Col3 = REPLACE(Col3, '"', ''), Col4 = REPLACE(Col4, '"', '') GO
Gruß Falk
- Als Antwort vorgeschlagen Stefan FalzModerator Freitag, 22. Juli 2011 21:02
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 3. August 2011 17:20
-
Hallo,
habe die Bulk Insert Funktion zum Importieren von CSV Daten ausprobiert. Das Ganze funktioniert mit der fmt datei wunderbar.
Jedoch habe ich eine CSV Datei mit ca. 50 Spalten und möchte die fmt datei nicht manuel erstellen.
Dabei bin ich auf die Funktion bcp gestoßen. Damit müsste man normal eine fmt Datei aus einer Tabelle erstellen können oder?
Leider habe ich damit ein Problem. Ich weiß nicht wo die Datei ausgegeben wird.
http://msdn.microsoft.com/de-de/library/ms191516.aspx
Damit könnte ich mit dem Assistenten zuerst eine CSV Datei importieren, damit dann eine fmt datei erstellen lassen und damit dann bequem weitere Daten importieren. (Habe nur die Express Version und kann daher das Paket nicht speichern)
Oder gibt es noch eine andere Möglichkeit den Import durchzuführen?
Vielen Dank.
Markus
-
Ich weiß nicht wo die Datei ausgegeben wird.
Hallo Markus,den Dateinamen gibts Du doch selbst über den -f Schalter vor. Verwendest Du keinen absoluten Pfad, sondern nur einen Dateinamen, dann wird die Datei im aktuellem Verzeichnis angelegt.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing