64

正しく引用されたCSVファイルをインポートしようとしています。つまり、データはカンマが含まれている場合にのみ引用されます。例:

41, Terminator, Black
42, "Monsters, Inc.", Blue

最初の行は正しくインポートされますが、引用符で囲まれたコンマがフィールド区切り文字として扱われたことを示唆する方法で2番目の行のエラーが発生します。

私はこのような提案を見てきました

CSVからのSQL一括インポート

フィールドターミネータを変更するには

FIELDTERMINATOR ='"、"'

ただし、私のCSVファイルはそれを必要とするフィールドのみを引用しているため、提案が機能するとは思われません。

SQLServerのBULKIMPORTステートメントは、正しく引用されたCSVファイルをインポートできますか?どのように?

4

12 に答える 12

32

残念ながら、SQL Server は引用符で囲まれたコンマを区切り記号として解釈します。これは、BCP と一括挿入の両方に適用されます。

http://msdn.microsoft.com/en-us/library/ms191485%28v=sql.100%29.aspxから

ターミネータ文字がデータ内にある場合、それはデータとしてではなくターミネータとして解釈され、その文字の後のデータは次のフィールドまたはレコードに属するものとして解釈されます。したがって、ターミネータを慎重に選択して、ターミネータがデータに表示されないようにしてください。

于 2012-10-16T01:51:44.593 に答える
21

これには別の解決策があります。

fmt ファイルを編集して、引用符をフィールド区切り文字の一部と見なします。

詳細については、これを確認してください。

http://blogs.msdn.com/b/sqlserverfaq/archive/2010/02/04/how-to-remove-unwanted-quotation-marks-while-importing-a-data-file.aspx

上記のリンクの抜粋:

引用符を削除する唯一の方法は、インポート操作中に指定された列区切り記号を変更することです。ここでの唯一の欠点は、挿入するデータを調べると、列区切り文字が列ごとに異なることにすぐに気付くことです (上で強調表示されている区切り文字)。

したがって、一括挿入または BCP を使用する予定がある場合は、各列に異なる列区切り文字を指定するには、フォーマット ファイルを使用する必要があります。上記のテーブル構造のフォーマット ファイルを生成すると、次のようになります。

9.0
3
1       SQLCHAR       0       5       "\t"     1     FName              SQL_Latin1_General_CP1_CI_AS
2       SQLCHAR       0       5       "\t"     2     LName              SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       50      "\r\n"   3     Company            SQL_Latin1_General_CP1_CI_AS

各列の正しい列区切り文字を表すように、フォーマット ファイルを変更します。使用する新しいフォーマット ファイルは次のようになります。

9.0
4
1       SQLCHAR       0       0     "\""      0     FIRST_QUOTE      SQL_Latin1_General_CP1_CI_AS
2       SQLCHAR       0       5     "\",\""   1     FNAME               SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       5     "\",\""   2     LNAME            SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR       0       50    "\"\r\n"  3     COMPANY          SQL_Latin1_General_CP1_CI_AS
于 2014-12-12T09:59:33.487 に答える
7

TextQualified オプションを有効にして、に設定していることを確認してください"

于 2016-03-18T00:02:22.667 に答える
5

私はこれと同じ問題を抱えていましたが、SSIS ルートに行く必要はありませんでした。そのため、実行が簡単で、その特定のフィールドにコンマがある引用符のケースを処理する PowerShell スクリプトを見つけました。

PowerShell スクリプトのソース コードと DLL: https://github.com/billgraziano/CsvDataReader

使用法を説明するブログは次のとおりです 。 http://www.sqlteam.com/article/fast-csv-import-in-powershell-to-sql-server

于 2016-03-02T07:28:32.540 に答える
3

私はこの問題に半日を費やしました。SQL Server データのインポートとエクスポート ウィザードを使用してインポートすることをお勧めします。そのウィザードには、この問題を解決する設定があります。詳細なスクリーンショットはこちら: https://www.mssqltips.com/sqlservertip/1316/strip-double-quotes-from-an-import-file-in-integration-services-ssis/ありがとう

于 2016-06-22T20:52:20.457 に答える
3

CSV テキスト ファイル データ プロバイダーで OpenRowSet を使用することも検討できます。

機能を有効にする必要がありますが、これは SQL Server >= 2005 のどのバージョンでも可能です。

http://social.msdn.microsoft.com/forums/en-US/sqldataaccess/thread/5869d247-f0a0-4224-80b3-ff2e414be402

于 2013-03-07T23:07:04.193 に答える
2

一部のテキストを時々二重引用符で囲むだけのデータで、同じ問題がありました。私の解決策は、BULK LOAD で二重引用符をインポートしてから、インポートしたデータに対して REPLACE を実行することです。

例えば:

一括挿入 CodePoint_tbl from "F:\Data\Map\CodePointOpen\Data\CSV\ab.csv" with (FIRSTROW = 1, FIELDTERMINATOR = ',', ROWTERMINATOR='\n');

Update CodePoint_tbl set Postcode = replace(Postcode,'"','') where charindex('"',Postcode) > 0

REPLACE スクリプトを書く手間を軽減するには、次のような結果から必要なものをコピーして貼り付けるだけです。

select C.ColID, C.[name] as Columnname into #Columns
from syscolumns C
join sysobjects T on C.id = T.id
where T.[name] = 'User_tbl'
order by 1;

declare @QUOTE char(1);
set @QUOTE = Char(39);
select 'Update User_tbl set '+ColumnName+'=replace('+ColumnName+','
 + @QUOTE + '"' + @QUOTE + ',' + @QUOTE + @QUOTE + ');
GO'
from #Columns
where ColID > 2
order by ColID;
于 2014-10-01T12:11:04.760 に答える
1

私は同じ問題を抱えていましたが、次の設定でうまくいきました:

bulk insert schema.table
from '\\your\data\source.csv'
with (
datafiletype = 'char'
,format = 'CSV'
,firstrow = 2
,fieldterminator = '|'
,rowterminator = '\n'
,tablock
)

私のCSVファイルは次のようになります。

"col1"|"col2"
"val1"|"val2"
"val3"|"val4"

私の問題は、以前に rowterminator を '0x0a' に設定していたため、機能しなかったことです。「\ n」に変更すると、機能し始めました...

于 2020-11-21T07:55:21.417 に答える
0

CSV形式の仕様では、仕様に準拠している限り、データが正しく引用されているかどうかは問題ではないと思います。過剰な引用符は、適切に実装されている場合、パーサーによって処理される必要があります。FIELDTERMINATORカンマで、ROWTERMINATOR行末です。これは、標準のCSVファイルを示します。これらの設定でデータをインポートしようとしましたか?

于 2012-10-15T19:20:57.737 に答える