[SQL Server] ","(ダブルコーディション)区切りのCSVをBULK INSERTする方法(FMTフォーマット)

inno
2014-07-02 20:11 7838 5
[SQL Server] ","(ダブルコーディション)区切りのCSVをBULK INSERTする方法(FMTフォーマット)


下記のように","(ダブルコーディション、カンマ、ダブルコーディション)区切りのCSVファイルを
BULK INSERTしてデータを登録する方法について説明したいと思います。

CSVファイルのデータ

"1","商品1","100"
"2","商品2","200"
"3","商品3","300"
"4","商品4","400"
"5","商品5","500"

この場合はフォーマットファイルの使用して登録することができます。
フォーマットファイルは2つの方式があり、fmtもしくはxmlを使います。


","(ダブルコーディション)区切りのCSVをBULK INSERTする方法


今回はFMTフォーマットファイルの使用して登録する方法を説明します。

では、テストの為に上記のCSVファイルを「C:\innoya」フォルダーを作成して「Data.csv」ファイルで保存してください。
次はテーブルを作成しますので、下記のSQLを実行して「dbo.TempData」テーブルを作成してください。


CREATE TABLE dbo.TempData
(
Sn int
,CodeName nvarchar(20)
,Amount nvarchar(20)
)

これで準備が整いました。
次はテキストエディターで下記の内容を登録して「C:\innoya」フォルダに「Data.fmt」で保存してください。


11.0 
4
1 SQLCHAR 0 15 "\"" 0 dummy ""
2 SQLCHAR 0 20 "\",\"" 1 col1 ""
3 SQLCHAR 0 20 "\",\"" 2 col2 ""
4 SQLCHAR 0 20 "\"\r\n" 3 col3 ""


上記の内容を簡単に説明すると。。。。

11.0 : SQL Serverのバージョンです。 9.0 (SQL Server 2005), 10.0 (SQL Server 2008), 11.0 (SQL Server 2012)
4 : 列の数です。csvファイルには列が3つしかありませんが、"(ダブルコーディション)影響で1つが増えます。
1 SQLCHAR 0 15 "\"" 0 dummy "" : これは列の情報記述したものです。
これをまた簡単に説明すると。。
1 : データ ファイル内の各フィールドの位置を示す番号
SQLCHAR : データ ファイルの特定のフィールドに格納されているデータ型
0 : フィールドのプレフィックス長文字の数
15 : データ ファイルの特定フィールドに格納されるデータ型の最大バイト数。
"\"" : データ ファイルのフィールドを分割する区切り文字
0 : SQL Server テーブルで列が表示される順序
dummy : SQL Server テーブルからコピーされる列の名前
"" : データ ファイル内の文字データや Unicode データを格納するときに使用される照合順序。
 
こんな感じです。
難しいですか??
各行の最後の部分に下記のような部分があります。
0 dummy "" : "(ダブルコーディション)影響でゴミデータを作成する必要があります。
1 col1 "" : ここからDBの連携するカラムです。CSVデータだと「1、2、3,4、5」のデータが入ります。
2 col2 "" : CSVデータだと「商品1、商品2。。。商品5」のデータが入ります。
3 col3 "" : CSVデータだと「100、200。。。500」のデータが入ります。

またcol1,col2,col3というカラム名を設定する部分がありますが、なんでもいいので、あまり気にしないでください。
私は分かりやすくあういうカラム名を使用しています。

またCSVファイルのデータのデータが最初から「","(ダブルコーディション)」を使用しない場合は
FMTフォーマットファイルを書き方が分かりますので、下記の例文をご参考ください。

CSVファイルのデータ
0001,000,"ああああ","おおおお",1
0002,000,"かかかか","ここここ",2
0003,000,"ささささ","そそそそ",3

FMTフォーマットファイルの書き方

11.0 
5
1 SQLCHAR 0 50 "," 1 col1 ""
2 SQLCHAR 0 50 ",\"" 2 col2 ""
3 SQLCHAR 0 50 "\",\"" 3 col3 ""
4 SQLCHAR 0 50 "\"," 4 col4 ""
5 SQLCHAR 0 50 "\r\n" 5 col5 ""

ここに全部書きながら説明するのは難しいので、実際に実行して動作を確認しながら理解しましょう。
もしくはQ&A掲示板に質問を書いてください。

ここまで準備が終わりましたら下記のSQLを実行して実際にデータを登録してみましょう。

 
BULK INSERT dbo.TempData
FROM
'C:\innoya\Data.csv'
WITH 
(
FORMATFILE = 'C:\innoya\Data.fmt'
)

  
 
正常に登録できましたか?
もし下記のようにエラーが発生する方はCSVファイルの文字コードを「ANSI」に変更後再度実行してみてください。
ここでは「UNICODE」でCSVファイルが保存されているとエラーが発生しますね。

エラーメッセージー

メッセージ 4832、レベル 16、状態 1、行 1
一括読み込み: データ ファイルで予期しないファイルの終了が検出されました。
メッセージ 7399、レベル 16、状態 1、行 1
リンク サーバー "(null)" の OLE DB プロバイダー "BULK" により、エラーがレポートされました。プロバイダーからエラーに関する情報を取得できませんでした。
メッセージ 7330、レベル 16、状態 2、行 1
リンク サーバー "(null)" の OLE DB プロバイダー "BULK" から行をフェッチできません。


では、問題なく正常に登録されたらデータを確認してみましょう。


SELECT TOP 20 * FROM dbo.TempData


実行結果


コメント

sorgelakhanakp9z5+9c 2024年 05月 22日 (19:17)
perferendis minima et eos dignissimos ullam perferendis a qui mollitia ipsam debitis. nesciunt dolorem quisquam in id quam voluptas quia omnis sed quod nihil.
flagstoneveneydel2q9 2024年 05月 29日 (21:40)
sint fuga similique dignissimos possimus consequatur ea aliquam est porro enim error omnis ut. tempora ducimus amet dolor quod doloribus cum sed aspernatur deleniti corrupti dolores molestias optio si
sorgelakhanakp9z5+9c 2024年 06月 05日 (23:28)
sit ut ut sequi ut adipisci similique alias perferendis sed assumenda sint molestias aut aspernatur. aspernatur in reiciendis possimus nobis accusantium dolorum consequatur rerum vel perferendis delec
sorgelakhanakp9z5+2e 2024年 06月 17日 (23:57)
quidem non temporibus omnis quis eos dolorem ea nihil fugiat dolorem at ab veniam est rerum. voluptas perferendis dolores fugiat nulla unde inventore omnis ut eius pariatur dignissimos quis. eos autem
grossekalluswko9l2+2 2024年 07月 30日 (23:07)
repudiandae temporibus ut autem eius qui excepturi. quaerat quis earum id nihil et voluptas hic veniam atque. et necessitatibus accusantium ut accusamus quod harum doloribus et velit magni aut id reru