web-dev-qa-db-ja.com

openrowset一括挿入で区切り文字を指定する

カーソルを使用して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:

xml

通常の一括挿入を実行する場合、区切り文字fielterminator = '"、"'を指定するオプションがありますが、openrowsetでそのようなものを見つけることができませんでした。

この問題の解決に役立つものは何ですか?

2
sql_girl

ただし、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部分​​で共通の文字列関数を使用してフィールドを分割できます(中間変数を使用する場合があります)チェーン計算で)。

1
Akina

あなたの答えは以下のリンクから見つけることができます:

https://stackoverflow.com/questions/4123875/commas-within-csv-data

以前はBCPと転送も扱っていましたが、列の重要度またはに基づいてクライアントと合意した後、カンマをスペース(可能な場合)に置き換えていました。

お役に立てれば。

0