it-swarm.com.de

Importieren Sie mehrere CSV-Dateien aus einem Ordner in SQL Server

Ich habe einen Ordner namens"Dump".Dieser Ordner besteht aus verschiedenen .CSV-Dateien . Der Ordner Location lautet'C:\Dump'

Ich möchte den Inhalt dieser Dateien in SQL Server importieren. Ich möchte den groben Code zusammen mit den richtigen Kommentaren, damit ich ihn verstehe. 

Ich habe ein paar Codes ausprobiert, die ich im Internet gefunden habe. Aber aus irgendeinem seltsamen Grund haben sie nicht ganz für mich geklappt. 


Die Schritte, die ich gerne hätte, sind

Schritt 1: Kopiere alle Dateinamen im Ordner in eine Tabelle

Schritt 2: Durchlaufen Sie die Tabelle und kopieren Sie die Daten mit Bulk Insert aus den Dateien.


Jemand bitte helfen Sie mir dabei. Vielen Dank im Voraus :)

14
SarangArd
    --BULK INSERT MULTIPLE FILES From a Folder 

    --a table to loop thru filenames drop table ALLFILENAMES
    CREATE TABLE ALLFILENAMES(WHICHPATH VARCHAR(255),WHICHFILE varchar(255))

    --some variables
    declare @filename varchar(255),
            @path     varchar(255),
            @sql      varchar(8000),
            @cmd      varchar(1000)


    --get the list of files to process:
    SET @path = 'C:\Dump\'
    SET @cmd = 'dir ' + @path + '*.csv /b'
    INSERT INTO  ALLFILENAMES(WHICHFILE)
    EXEC Master..xp_cmdShell @cmd
    UPDATE ALLFILENAMES SET WHICHPATH = @path where WHICHPATH is null


    --cursor loop
    declare c1 cursor for SELECT WHICHPATH,WHICHFILE FROM ALLFILENAMES where WHICHFILE like '%.csv%'
    open c1
    fetch next from c1 into @path,@filename
    While @@fetch_status <> -1
      begin
      --bulk insert won't take a variable name, so make a sql and execute it instead:
       set @sql = 'BULK INSERT Temp FROM ''' + @path + @filename + ''' '
           + '     WITH ( 
                   FIELDTERMINATOR = '','', 
                   ROWTERMINATOR = ''\n'', 
                   FIRSTROW = 2 
                ) '
    print @sql
    exec (@sql)

      fetch next from c1 into @path,@filename
      end
    close c1
    deallocate c1


    --Extras

    --delete from ALLFILENAMES where WHICHFILE is NULL
    --select * from ALLFILENAMES
    --drop table ALLFILENAMES
37
SarangArd
1
Inus C

In Python können Sie d6tstack verwenden, was dies einfach macht

import d6tstack
import glob

c = d6tstack.combine_csv.CombinerCSV(glob.glob('*.csv'))
c.to_mssql_combine('mssql+pymssql://usr:[email protected]/db', 'tablename')

Siehe SQL-Beispiele . Es befasst sich auch mit Datenschemaänderungen , erstellt eine Tabelle und ermöglicht Ihnen die Vorverarbeitung von Daten. Es nutzt BULK INSERT, sollte also genauso schnell sein. 

0
citynorman

Um Schritt 1 zu lösen, können Sie mit xp_dirtree auch alle Dateien und Ordner auflisten.

Beachten Sie, dass es sich um eine undokumentierte Funktion handelt. Sicherheitsvorkehrungen müssen beachtet werden. Absichtlich erstellte Dateinamen können ein Eindringvektor sein.

0
user10191093

um die Antwort von SarangArd zu erweitern, können Sie temp durch Folgendes ersetzen, wenn Ihr Dateiname mit Ihrem Tabellennamen übereinstimmt.

' + Left(@filename, Len(@filename)-4) + '
0
TheOriginalCole