web-dev-qa-db-ja.com

複数のCSVファイルをフォルダーからSQL Serverにインポートする

"Dump。"というフォルダーがあります。このフォルダーはさまざまな.CSVファイルで構成されています。フォルダーの場所は 'C:\ Dump'

これらのファイルの内容をSQL Serverにインポートします。私はそれを理解できるように、適切なコメントとともに大まかなコードが必要です。

ネットで見つけたコードをいくつか試しました。しかし、奇妙な理由で彼らは私のためにうまく機能していません。


私がしたいステップは

ステップ1:フォルダー内のすべてのファイル名をテーブルにコピーします

ステップ2:テーブルを反復処理し、一括挿入を使用してファイルからデータをコピーします。


誰かがこれについて私を助けてください。事前に感謝します:)

16
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
41
SarangArd
1
Inus C

pythonでは d6tstack を使用できます。

import d6tstack
import glob

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

SQLの例 を参照してください。また、 データスキーマの変更 を扱い、テーブルを作成して、データを前処理できます。 BULK INSERTですので、同じくらい速くなければなりません。

0
citynorman

手順1を解決するには、xp_dirtreeを使用してすべてのファイルとフォルダーを一覧表示することもできます。

文書化されていない関数であることを覚えておいてください。セキュリティ上の注意事項を考慮する必要があります。意図的に作成されたファイル名は、侵入ベクトルである可能性があります。

0
user10191093

sarangArdの回答を拡張するには、ファイル名がテーブル名と一致する場合、tempを次のように置き換えます。

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