22

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

これらのファイルの内容を SQL Server にインポートしたいと考えています。大まかなコードと適切なコメントが欲しいので、それを理解してください。

ネットで見つけたいくつかのコードを試しました。しかし、いくつかの奇妙な理由で、それらは私にとってはうまくいきませんでした.


私がしたいステップは

手順 1:フォルダー内のすべてのファイル名をテーブルにコピーする

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


誰かがこれについて私を助けてください。事前にどうもありがとう:)

4

8 に答える 8

0

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なので、同じくらい高速でなければなりません。

于 2018-12-17T04:18:22.470 に答える
0

このコードは、インポートされた CSV ファイルごとに新しいテーブルを作成します。CSV ファイルから空のデータベースを作成するのが最適です。

CREATE TABLE ALLFILENAMES
(
             WHICHPATH VARCHAR(255)
            ,WHICHFILE VARCHAR(255)
)

DECLARE @filename VARCHAR(255),
        @path     VARCHAR(255),
        @sql      VARCHAR(8000),
        @cmd      VARCHAR(1000)

SET @path = 'L:\DATA\SOURCE\CSV\'  --PATH TO YOUR CSV FILES (CHANGE TO YOUR PATH)
SET @cmd = 'dir ' + @path + '*.csv /b'

INSERT INTO ALLFILENAMES(WHICHFILE)
EXEC Master..xp_cmdShell @cmd

UPDATE ALLFILENAMES
  SET WHICHPATH = @path
WHERE WHICHPATH IS NULL

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
    CREATE TABLE #Header
    (
                 HeadString NVARCHAR(MAX)
    )
    DECLARE @Columns NVARCHAR(MAX) = ''
    DECLARE @Query NVARCHAR(MAX) = ''
    DECLARE @QUERY2 NVARCHAR(MAX) = ''
    DECLARE @HeaderQuery NVARCHAR(MAX) = ''

    SELECT @HeaderQuery = @HeaderQuery + 'bulk insert #Header from ''' + @path + @filename + '''  
        with(firstrow=1,lastrow=1)'
    EXEC (@HeaderQuery)

    SELECT @Columns = (SELECT QUOTENAME(value) + ' nvarchar(max)' + ','
                       FROM #Header
                            CROSS APPLY STRING_SPLIT(HeadString,',') FOR xml PATH(''))
    IF ISNULL(@Columns,'') <> ''
    BEGIN
        SET @Columns = LEFT(@Columns,LEN(@Columns) - 1)

        SELECT @Query = @Query + 'CREATE TABLE ' + Replace(@filename,'.csv','') + ' (' + replace(@Columns,'"','') + ')'
        PRINT @Query
        EXEC (@QUERY)
    END

    SELECT @QUERY2 = @QUERY2 + 'bulk insert ' + replace(Replace(@filename,'.csv',''),'.TPS','') + ' from ''' + @path + @filename + '''  
        with(firstrow=2,FORMAT=''csv'',FIELDTERMINATOR='','',ROWTERMINATOR=''\n'')'
    EXEC (@QUERY2)

    DROP TABLE #Header
    FETCH NEXT FROM c1 INTO @path,
                            @filename
END

CLOSE c1

DEALLOCATE c1
于 2020-11-03T19:35:21.180 に答える
0

ステップ 1 を解決するために、xp_dirtree を使用してすべてのファイルとフォルダーを一覧表示することもできます。

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

于 2018-12-11T15:19:39.993 に答える