web-dev-qa-db-ja.com

SQLサーバーカンマを含むデータを含むcsvを一括挿入する

以下はcsvのサンプルラインです

012,12/11/2013,"<555523051548>KRISHNA  KUMAR  ASHOKU,AR",<10-12-2013>,555523051548,12/11/2013,"13,012.55",

KRISHNA KUMAR ASHOKU、ARは単一のフィールドとして表示されますが、KRISHNA KUMAR ASHOKUとARは、コンマのために2つの異なるフィールドとして扱われますが、 "で囲まれていますが、まだ運がありません。

私は試した

BULK
INSERT tbl
FROM 'd:\1.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
FIRSTROW=2
)
GO

それに対する解決策はありますか?

11
sumit

答えは次のとおりです。それはできません。 http://technet.Microsoft.com/en-us/library/ms188365.aspx を参照してください。

「CSVファイルからのデータのインポート

SQL Serverの一括インポート操作では、カンマ区切り(CSV)ファイルはサポートされていません。ただし、場合によっては、SQL Serverへのデータの一括インポート用のデータファイルとしてCSVファイルを使用できます。 CSVデータファイルからデータをインポートするための要件については、「一括エクスポートまたはインポートのためのデータの準備(SQL Server)」を参照してください。

一般的な解決策は、CSVファイルを正常にインポートできるファイルに変換する必要があることです。さまざまな区切り文字(TABなど)を使用してファイルを作成するか、CSVファイルを理解するツール(Excelまたは多くのスクリプト言語など)を使用してテーブルをインポートし、固有の区切り文字(TABなど)。そこからBULK INSERTできます。

11
david.pfx

残念ながら、SQL Serverインポートメソッド(BCP && BULK INSERT)は ""の引用を理解できません

ソース: http://msdn.Microsoft.com/en-us/library/ms191485%28v=sql.100%29.aspx

5
zee

最近この問題に遭遇し、タブ区切り形式に切り替える必要がありました。それを行い、SQL Server Management Studioを使用してインポートを実行する場合(データベースを右クリックして[タスク]を選択し、次に[インポート]を選択)、タブ区切りは正常に機能します。タブ区切りの一括挿入オプションも機能するはずです。

Microsoft SQL Serverにこのカンマ区切りの問題があることを知ったとき、私は非常に驚いたことを認めなければなりません。 CSVファイル形式は非常に古い形式であるため、これが最新のデータベースの問題であることを発見したのは非常に残念です。

3
gregarius1111

MSはこの問題に対処しました。with句でFIELDQUOTEを使用して、引用符で囲まれた文字列のサポートを追加できます。

FIELDQUOTE = '"',

sQL Server 2017以降を使用している場合は、with句のどこでもトリックを実行できます。

1
Geoff Griswald

彼らはこのSQL Server 2017(14.x)CTP 1.1のサポートを追加しました。 BULK INSERTコマンドには、FORMAT = 'CSV'入力ファイルオプションを使用する必要があります。

明確にするために、csvが問題を引き起こしているように見えるものを以下に示します。最初の行は解析が簡単で、2番目の行には引用符で囲まれたフィールド内にコンマがあるため、曲線のボールが含まれています。

jenkins-2019-09-25_cve-2019-10401,CVE-2019-10401,4,Jenkins Advisory 2019-09-25: CVE-2019-10401: 
jenkins-2019-09-25_cve-2019-10403_cve-2019-10404,"CVE-2019-10404,CVE-2019-10403",4,Jenkins Advisory 2019-09-25: CVE-2019-10403: CVE-2019-10404: 

壊れたコード

BULK INSERT temp
    FROM 'c:\test.csv'
    WITH
    (
        FIELDTERMINATOR = ',',
        ROWTERMINATOR = '0x0a',
        FIRSTROW= 2
    );

作業コード

BULK INSERT temp
    FROM 'c:\test.csv'
    WITH
    (
        FIELDTERMINATOR = ',',
        ROWTERMINATOR = '0x0a',
        FORMAT = 'CSV',
        FIRSTROW= 2
    );
0
HelpfulH4cker