23

大きな CSV ファイルを SQL サーバーにインポートする必要があります。私はこれを使用しています:

BULK 
INSERT CSVTest
        FROM 'c:\csvfile.txt'
            WITH
    (
                FIELDTERMINATOR = ',',
                ROWTERMINATOR = '\n'
    )
GO

問題は、すべてのフィールドが引用符 (" ") で囲まれているため、行は実際には次のようになります。

"1","","2","","sometimes with comma , inside", "" 

どうにかしてそれらを一括インポートし、引用符をフィールド区切り記号として使用するように SQL に指示できますか?

編集: '","' を区切り文字として使用する際の問題は、提案されている例のように: ほとんどの例では、最初の " を最初の列に、最後の " を最後の列に含むデータをインポートし、先に進んでそれを取り除いてください。悲しいかな、最初の (そして最後の) 列は datetime であり、"20080902 を datetime としてインポートすることはできません。

私が読んだことから、FORMATFILEが道だと思いますが、ドキュメント(MSDNを含む)はひどく役に立ちません。

4

14 に答える 14

13

試すFIELDTERMINATOR='","'

ここに最初と最後の引用を助けるための素晴らしいリンクがあります...彼がSPの部分文字列をどのように使用したかを見てください

http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file

于 2008-09-18T20:20:21.273 に答える
10

私が時々使用する別のハックは、Excel で CSV を開き、SQL ステートメントを各行の最後のセルに書き込むことです。例えば:

=concatenate("insert into myTable (columnA,columnB) values ('",a1,"','",b1,"'")")

塗りつぶしは、これをすべての行に入力できます。次に、出力をコピーして新しいクエリ ウィンドウに貼り付けます。

これは昔ながらの方法ですが、インポートをたまにしか行う必要がない場合は、「適切な」方法でインポートを行うためのあいまいなドキュメントをすべて読む手間を省くことができます。

于 2008-09-30T03:38:03.353 に答える
4

OpenRowSetを試してください。これは、Excelのものをインポートするために使用できます。ExcelはCSVファイルを開くことができるので、正しい[ConnectionString][2]を理解するだけで済みます。

[2]:Driver = {Microsoft Text Driver(* .txt; * .csv)}; Dbq = c:\ txtFilesFolder \; Extensions = asc、csv、tab、txt;

于 2008-09-18T20:24:43.197 に答える
3

これが実際の解決策ではないことはわかっていますが、インポートにはダミーのテーブルを使用し、すべてに nvarchar を設定しています。次に、" 文字を取り除き、変換を行う挿入を行います。きれいではありませんが、機能します。

于 2008-09-19T05:58:36.700 に答える
2

私は、オープンソースライブラリである FileHelpers を使用すると言います

于 2008-10-18T18:39:29.123 に答える
1

これをプログラムで行う必要がありますか、それとも1回限りのショットですか?

Enterprise Managerを使用して、[データのインポート]を右クリックすると、区切り文字を選択できます。

于 2008-09-18T20:22:32.513 に答える
1

BCP/BULK INSERT に注意する必要があります。BSP も Bulk Insert も、フォーマット ファイル (XML フォーマット ファイルでさえオプションが提供されていません) やダミーの ["] 文字を使用しても、引用に一貫性がない場合、これを適切に処理しないためです。 [","] を区切り記号として使用します。技術的には、[,] 文字が埋め込まれていない場合、CSV ファイルに ["] 文字を含める必要はありません。

このため、コンマ区切りファイルはコメディー限定ファイルと呼ばれることがあります。

OpenRowSet はサーバー上で Excel を必要とし、64 ビット環境では問題が発生する可能性があります。64 ビットの Jet で Excel を使用すると問題が発生することはわかっています。

将来、ファイルが予想と異なる可能性がある場合は、SSIS が最善の策です。

于 2008-09-18T21:36:09.920 に答える
1

必要に応じて非常に便利なこのコードを試すことができます。これにより、コードから不要なセミコロンが削除されます。たとえば、データが次のような場合:
"Kelly","Reynold","kelly@reynold.com"

Bulk insert test1
from 'c:\1.txt' with ( 
    fieldterminator ='","'
    ,rowterminator='\n')

update test1<br>
set name =Substring (name , 2,len(name))
where name like **' "% '**

update test1
set email=substring(email, 1,len(email)-1)
where email like **' %" '**
于 2008-09-30T03:30:32.903 に答える
0

DTSまたはSSISを使用することもできます。

于 2008-09-18T20:49:58.207 に答える
0

うん、Kリチャードは正しい:FIELDTERMINATOR = '","'

詳細については、 http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-fileを参照してください。

于 2008-09-18T20:22:52.030 に答える
0

ファイルを解析して DataTable にする方法がわかったら、それを SQL Server に挿入するための SqlBulkInsert クラスをお勧めします。

于 2008-09-19T06:04:43.957 に答える
0

入力形式を制御できますか? | | (パイプ)、および \t は通常、より適切なフィールド ターミネータになります。

于 2008-09-18T21:51:29.760 に答える