カーソルを使用してCSVファイルからテーブルにデータを挿入し、行セットの一括挿入を開こうとしています。これは私にとって99%の確率で機能しますが、csvファイルのフィールドの1つにコンマ(、)が含まれている場合、データインポートは無効になり、すべての列がその1列後にインポートされます。たとえば、次のようになります。
timestamp username name IP title
20190331 ABCD12G david hertz 1.1.1.1 null
しかし、名前の列にカンマがある場合(たとえば)は次のようになります。
timestamp username name IP title
20190331 ABCD12G david hertz 1.1.1.1
csvの例:
username,name,ip,title
ABCD12G,david,hertz,1.1.1.1,''
これは私が使用している構文です:
insert into [player table]
select 20190331,* FROM OPENROWSET(BULK 'D:\folder\2019\03-
31\Player_statistics.csv', FIRSTROW = 2,
FORMATFILE='D:\folder\test\xml\Player_statistics.xml')
as t1
単語の途中にあるコンマを無視するようにこれを変更するにはどうすればよいですか(文字を制限しない別のクライアントから取得したCSVを制限できません)。
openrowsetでのインポートに使用しているxml:
通常の一括挿入を実行する場合、区切り文字fielterminator = '"、"'を指定するオプションがありますが、openrowsetでそのようなものを見つけることができませんでした。
この問題の解決に役立つものは何ですか?
ただし、csvファイルのフィールドの1つにコンマ(、)が含まれている場合
すべての行にカンマが含まれている場合、解決策は
<ROW>
<COLUMN SOURCE="1" NAME="username" xsi:type="SQLSMALLINT"/>
<COLUMN SOURCE="2" NAME="name1" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="name2" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="IP" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="5" NAME="title" xsi:type="SQLNVARCHAR"/>
</ROW>
INSERT INTO [player table]
SELECT 20190331,
username,
name1+','+name2,
IP,
title
FROM OPENROWSET( BULK 'D:\folder\2019\03-31\Player_statistics.csv',
FIRSTROW = 2,
FORMATFILE='D:\folder\test\xml\Player_statistics.xml') t1
一部の行だけにカンマが含まれていて、title
がnull /空でない場合は、
INSERT INTO [player table]
SELECT 20190331,
`username`,
CASE WHEN title IS NULL
THEN name1
ELSE name1+','+name2 END,
CASE WHEN title IS NULL
THEN name2
ELSE IP END,
CASE WHEN title IS NULL
THEN IP
ELSE title END
IP,
title
FROM OPENROWSET( BULK 'D:\folder\2019\03-31\Player_statistics.csv',
FIRSTROW = 2,
FORMATFILE='D:\folder\test\xml\Player_statistics.xml') t1
一部のtitle
がnull /空の場合、区別する簡単な方法が見つかりません。
[〜#〜]更新[〜#〜]
解決策は次のとおりです。CSVを2つのフィールドのみで分割します-username
とスラック全体。スラックは、インポートクエリのSELECT部分で共通の文字列関数を使用してフィールドを分割できます(中間変数を使用する場合があります)チェーン計算で)。
あなたの答えは以下のリンクから見つけることができます:
https://stackoverflow.com/questions/4123875/commas-within-csv-data
以前はBCPと転送も扱っていましたが、列の重要度またはに基づいてクライアントと合意した後、カンマをスペース(可能な場合)に置き換えていました。
お役に立てれば。