1

非常にうまく機能する100万行のCSVのインポートを作成しました(OPENROWSET BULKを使用します(他の列との相互結合が必要なため、BULK INSERTは使用しませんでした)。formatfileはターミネーターとしてコンマを使用します。

これは、私が開発に使用していたCSVの例です。

Reference, Name, Street
1,Dave Smith, 1 Test Street
2,Sally SMith,1 Test Street

動作させると、データ自体にカンマが含まれている可能性があることを誰かが思い出しました。

Reference, Name, Street
"1","Dave Smith", "1 Test Street"
"2","Sally Smith","1,Test Street" <-comma in street

FormatFilesを使用して、データにコンマが含まれるCSVをどのように処理しますか?(または、ファイルをTABで区切る必要があるとだけ言っていますか)?

4

2 に答える 2

2

フィールドターミネータがデータ内で発生する可能性がある場合は、TABまたはPIPE区切り文字(またはデータに対して機能するもの)を使用するのが最適な場合があります。

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

http://msdn.microsoft.com/en-us/library/ms191485.aspx

于 2012-07-16T17:43:57.177 に答える
0

データフィールド内の区切り文字は、区切られたファイルの一般的な問題です。これに対処するためのいくつかの一般的な戦術は次のとおりです。

  1. ファイルに書き込まれる前に、データフィールドからすべての区切り文字が削除された状態でデータファイルを再作成します。これにより、OPENROWSETエラーが排除されますが、データの整合性は維持されません。
  2. 別の区切り文字を使用してデータファイルを再作成します。私の経験では、タブ区切り文字の方が適しています。データ内でコンマよりもタブ文字に遭遇することはあまり一般的ではありません。しかし、それは確かに前代未聞ではありません。データ内のタブも見ました。
  3. データフィールドを二重引用符で囲みます。これには、XML形式ファイルを微調整する必要があります。

データファイルを手動で編集することは、上記のオプションのいずれでも実行できる可能性があります。ただし、特に大きなファイルの場合は、面倒な場合があります。(Notepad.exeで数GBのファイルを開くだけでも、忍耐力が必要です。)現実的には、作成者にファイルを再作成してもらいたいと思います。オプション#1は常に「機能」する必要があります。しかし、繰り返しになりますが、あなたが生きることができないかもしれないデータの完全性の問題があります。オプション#2はおそらく多くの場合に機能しますが、防弾ではありません。オプション#3も防弾ではありませんが(データフィールド内に区切り文字を含めることは常に可能です)、可能な限り近いものです。さらに、データの整合性を維持します。

XML形式ファイルの可能性の1つは次のとおりです。

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RECORD>
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR='","' MAX_LENGTH="5"/>
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR='","' MAX_LENGTH="128" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="3" xsi:type="CharTerm" TERMINATOR='"\r\n' MAX_LENGTH="128" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="Reference" xsi:type="SQLVARYCHAR"/>
  <COLUMN SOURCE="2" NAME="Name" xsi:type="SQLVARYCHAR"/>
  <COLUMN SOURCE="3" NAME="Street" xsi:type="SQLVARYCHAR"/>
 </ROW>
</BCPFORMAT>

フィールドターミネーターに注意してください。一重引用符を使用","して、ターミネーターおよび"\r\n行ターミネーター(COLUMN 3ターミネーター)として識別しました。私はそれを知識に基づいて推測しNameStreet最大128文字です。必要に応じて編集してください。

問題:

  1. OPENROWSET()クエリはReference、先頭に"二重引用符を付けて返されます。そしてそのために...
  2. ReferenceINT(またはSMALLINT、BIGINTなど)として返すことはできません。VARCHAR(xsi:type="SQLVARYCHAR")として返されます

Reference提供されている特定のデータサンプルについては、データフィールドから二重引用符を削除し、XML形式ファイルをであるように調整し、さらにXML形式ファイルをであるように調整FIELD ID="1"します。TERMINATOR=',"'COLUMN SOURCE="1"xsi:type="SQLINT"

いくつかの追加情報については、このブログ投稿が役立つ場合があります:OPENROWSETおよびBULK行セットプロバイダー入門-パート2

于 2016-01-30T20:25:21.767 に答える