Jump to content

CSV Datei nur auslesen / Tabelle mit CSV Struktur erstellen


Recommended Posts

Hallo liebes Forum,

 

ich habe einige Foren nach einer Lösung für mein Problem durchforstet aber leider keine Lösung gefunden. Deshalb wende ich mich an euch, in der Hoffnung, eine Lösung zu finden.

Es handelt sich um ein SQL Server 11.0.

 

Es sollen in eine Datenbank ca. 90-100 CSV Dateien mehrmals im Jahr importiert werden. Die Tabellenstrukturen können sich aber bei jedem Import ändern. D.h. man hat bspw. heute eine CSV-Datei mit 28 Spalten und in einem halben Jahr hat genau diese Datei nur noch 27 Spalten. So kann ich die ganze Tabelle wegschmeißen und die Struktur neu anlegen oder mir alle Spalten anschauen und herausfinden, welche Spalte fehlt oder zu viel drin ist. 

 

Ich habe das ganze Vorgehen insoweit automatisiert, dass ich die CSV-Dateien, welche sich in einem bestimmten Pfad befindet, in eine Tabelle schreibe (Dateiname, Dateityp, etc.) und diese in eine Schleife eingebunden habe (siehe nachfolgend das Statement dazu):

--Tabelle für neue CSV-Dateien leeren
TRUNCATE TABLE CSV_Files;
PRINT 'Tabelle für CSV-Dateien geleert'


--CSV-Dateinamen in die Tabelle einfügen
INSERT INTO CSV_Files(Dateiname, Tiefe, Datei)
EXEC master..xp_dirtree 'C:\Bsp_Ordner', 1, 1 
PRINT 'CSV-Dateien in die Tabelle CSV_Files geschrieben'


--Dateityp in separate Spalte schreiben
UPDATE CSV_Files
SET Dateityp = '.csv',
	Dateiname = REPLACE(Dateiname, '.csv', '')

DECLARE @i int = 1
DECLARE @Zaehler int = (SELECT MAX(ID_CSV) FROM CSV_Files)
DECLARE @Filename varchar(50)
DECLARE @File varchar(50)
DECLARE @Ext varchar(50)
DECLARE @Tablename varchar(50)
DECLARE @Truncate varchar(200)
DECLARE @Befehl varchar(2000)

SET @Ext = '.csv'


WHILE @i <= @Zaehler
BEGIN

	PRINT 'Schleife Nr: ' +CAST(@i  as varchar)
	
	SET @Filename = (SELECT Dateiname FROM CSV_Files WHERE ID_CSV = @i)
	SET @Tablename = @Filename
	SET @Truncate = 'TRUNCATE TABLE '+@Tablename
	SET @File = @Filename + @Ext

	SET @Befehl = 'BULK INSERT '+@Tablename+'
	FROM ''C:\Bsp_Ordner\'+@File+'''
	WITH(
			FIRSTROW = 2,
			FIELDTERMINATOR = ''0x3b'',
			ROWTERMINATOR = ''\n''					 
		)'

	EXEC (@Truncate)
	PRINT 'Tabelle '+@Tablename+' wurde gelöscht'

	EXEC (@Befehl)
	PRINT 'Tabelle '+@Tablename+' wurde befüllt
	'
	SET @i = @i + 1
	PRINT 'Als nächstes Schleife Nr: ' +CAST(@i  as varchar)
END

 

Solange die alte Tabellenstruktur mit der Struktur in der entsprechenden CSV-Datei übereinstimmt, läuft die Schleife auch einwandfrei durch und liefert mir genau das Ergebnis, welches ich erwarte.

Nun meine Frage an euch:

Gibt es eine Möglichkeit, CSV-Dateien per Code einfach nur auszulesen (somit könnte ich die Tabellen bei jedem Import komplett wegschmeißen und durch das Auslesen neu anlegen. Anschließend gehts weiter mit der Schleife, welches dann problemlos durchlaufen würde) ?

Oder gibt es eine Möglichkeit, per Code die CSV-Dateien direkt in neue Tabellen (Strukturen aus der CSV-Datei) zu importieren? Das passiert ja, wenn ich manuell über die Datenbank -> Tasks.. -> Datei importieren einzelne CSV-Dateien importiere. Da wird ja als Zieltabelle entweder eine bestehende ausgewählt oder wenn nicht vorhanden, eine neue angelegt.

 

Ich hoffe, ihr könnt mir bei diesem Problem helfen. Ich verzweifle schon so langsam, weil ich seit Wochen keine Lösung dazu gefunden habe und es nicht zumutbar ist, 100 CSV-Dateien einzeln zu importieren.

 

Beste Grüße

Yasin 

Edited by Yasin_k93
Schönheitsfehler im Code
Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...