web-dev-qa-db-fra.com

Importer plusieurs fichiers CSV vers SQL Server à partir d'un dossier

J'ai un dossier appelé"Dump".Ce dossier est constitué de divers fichiers .CSV . Le dossier est situé dans le dossier'C:\Dump'

Je veux importer le contenu de ces fichiers dans SQL Server. Je veux le code brut avec les commentaires appropriés pour que je le comprenne. 

J'ai essayé quelques codes que j'ai trouvés sur le net. Mais ils n’ont pas tout à fait travaillé pour moi pour une raison étrange. 


Les étapes que je voudrais avoir sont

Étape 1: Copiez tous les noms de fichiers du dossier dans une table.

Étape 2: Parcourez le tableau et copiez les données à partir des fichiers à l'aide de l'insertion en bloc.


Quelqu'un m'aider s'il vous plaît sur celui-ci. Merci beaucoup d'avance :)

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

En python, vous pouvez utiliser d6tstack pour simplifier cela.

import d6tstack
import glob

c = d6tstack.combine_csv.CombinerCSV(glob.glob('*.csv'))
c.to_mssql_combine('mssql+pymssql://usr:pwd@localhost/db', 'tablename')

Voir exemples SQL . Il traite également des modifications de schéma data , crée une table et vous permet de prétraiter les données. Il utilise BULK INSERT et devrait donc être aussi rapide. 

0
citynorman

Pour résoudre l'étape 1, xp_dirtree peut également être utilisé pour répertorier tous les fichiers et dossiers.

Gardez à l'esprit qu'il s'agit d'une fonction non documentée. Les précautions de sécurité doivent être considérées. Les noms de fichiers intentionnellement créés pourraient être un vecteur d’intrusion.

0
user10191093