0

この XLS ファイルを取得します

ここに画像の説明を入力

次に、この XLS ファイルを CSV として保存し、テキスト エディターで開きます。これは私が見るものです:

Col1,Col2,Col3,Col4,Col5,Col6,Col7
1,ABC,"AB""C","D,E",F,03,"3,2"

列 C の二重引用符は として保存されAB""C、列の値は引用符で囲まれ、データ内の二重引用符は 2 つの二重引用符に置き換えられ、引用符がデータ内で発生し、データを終了していないことを示しています。列の値。また、列 G の値3,2が引用符で囲まれていることもわかります。これにより、新しい列を示すのではなく、データ内にコンマがあることが明確になります。ここまでは順調ですね。

すべての列の値が引用符で囲まれていないことに少し驚いていますが、コンマドや dbl の引用符文字などの特殊文字がデータに存在する場合にのみ EXCEL が列区切り文字を指定すると仮定すると、これでも妥当なように思えます。

ここで、SQL Server を使用して csv ファイルをインポートしようとしています。テキスト修飾子文字として二重引用符文字を指定していることに注意してください。

図 2 を挿入

そして、列区切り文字としてのコマンド char。ただし、SSIS は列 3 を誤ってインポートすることに注意してください。たとえば、2 つの連続する二重引用符文字が単一の二重引用符文字として変換されません。

ここに画像の説明を入力

Excel と SSIS をうまく使いこなすにはどうすればよいですか?

一般に、データ内で発生する可能性が低い列区切り文字を使用することで問題を回避できますが、これは実際の解決策ではありません。

これからファイルを変更すると、

Col1,Col2,Col3,Col4,Col5,Col6,Col7
1,ABC,"AB""C","D,E",F,03,"3,2"

...これに:

Col1,Col2,Col3,Col4,Col5,Col6,Col7
1,ABC,"AB"C","D,E",F,03,"3,2"

つまり、列 C の値で 2 つの連続する引用符を削除すると、データが適切に読み込まれますが、これは少し混乱します。まず、SSIS は、B と C の間の二重引用符がその列の値を終了していないことをどのように判断するのでしょうか? 次の文字がコンマ列区切り文字でも行区切り文字(CRLF)でもないからでしょうか? そして、なぜ Excel はこのようにエクスポートするのでしょうか?

ウィキペディアによると、CSV ファイルには次の 2 つの特徴があります。

  1. 改行 (CRLF)、二重引用符、およびコンマを含むフィールドは、二重引用符で囲む必要があります。例えば:

    「aaa」、「b CRLF bb」、「ccc」CRLF zzz、yyy、xxx

  2. 二重引用符を使用してフィールドを囲む場合、フィールド内にある二重引用符は、その前に別の二重引用符を付けてエスケープする必要があります。例えば:

    "aaa"、"b"、"bb"、"ccc"

ただし、SSIS はインポート時にそれを好まないようです。データの列区切り記号、テキスト区切り記号、または行区切り記号として使用される特殊文字を含む可能性のある CSV ファイルを Excel で作成するにはどうすればよいですか? ウィキペディアで指定されているアプローチを使用して機能しない理由はありません。これは、古いMS DTSパッケージが行っていたと私が思っていたことです...

アップデート:

メモ帳を使用する場合は、入力ファイルを次のように変更します

Col1,Col2,Col3,Col4,Col5,Col6,Col7,Col8
"1","ABC","AB""C","D,E","F","03","3,2","AB""C"

Excelは問題なく読み取ります

ここに画像の説明を入力

しかし、SSISは戻ります

The preview sample contains embedded text qualifiers ("). The flat file parser does not support embedding text qualifiers in data. Parsing columns that contain data with text qualifiers will fail at run time.
4

2 に答える 2

1

結論:

ちょうどあなたのアップデートでエラーメッセージが言うように...

The flat file parser does not support embedding text qualifiers in data. Parsing columns that contain data with text qualifiers will fail at run time.

MicrosoftConnectで確認されたバグ。これを読んでいるすべての人に、前述のリンクをクリックして投票し、この悪臭を修正してもらうことをお勧めします。これは、私が遭遇した最もひどいバグのトップ10に含まれています。

于 2012-11-05T22:11:43.083 に答える
0

カンマ区切りを使用する必要がありますか。

Text修飾子なしでパイプ区切り文字を使用しましたが、うまくいきました。これがテキストファイルからの私の出力です。

1|ABC|AB"C|D,E|F|03|3,2

私の意見では、3 つの選択肢があります。

  1. データをステージ テーブルに読み取ります。
  2. 列に対して必要な更新クエリを実行します
  3. ステージ テーブルからデータを選択し、フラット ファイルに出力します。

また

  1. パイプを区切り文字として使用します。

また

  1. これらすべてを C# アプリケーションで実行し、コードでビルドします。
  2. 行を SSIS のスクリプトに送信し、必要なファイルを解析してビルドすることもできます。

テキスト修飾子と「文字」で区切られたフィールドの使用には、確かに問題があります。

楽しんで!

于 2012-11-05T20:28:35.233 に答える