次の 6 行のサンプル CSV ファイルを検討してください。
"Col1","Col2", "Col3",
"Col1Row1","Col2Row1", 1
"Col1Row2","",
"Col1Row3",,0
"Row 4 Example of ""double quotes"" in the data","Row 4 col 2",0
"Row 5 Example of a comma, no problem, in the data","Row 5 col 2",0
"Row 6 Example of embedded CR LF right here
in the data","Row 6 col 2",0
ファイルのプロパティ:
- 列見出し = True
- 列区切り文字 char = コンマ
- テキスト区切り文字 char = "
- 行区切り文字 = {CR}{LF}
- テキスト区切り文字 char の 2 つの連続するオカレンスによって表されるデータ内のテキスト区切り文字
列の定義:
- Col1 = varchar
- Col2 = varchar
- Col3 = 数値
DTS を使用していた頃のことを思い出すと、DTS パッケージでは、データに列区切り文字、テキスト区切り文字、または行区切り文字を含む可能性のあるファイルの処理に問題はありませんでした。さらに、NULL 値と非 null 値、特に NULL 文字列と長さ 0 の文字列を区別することもできます。
十分なテストを行った後、このスタック オーバーフローの投稿で、SSIS の CSV パーサーは、データ内のテキスト区切り文字や行区切り文字などの特殊文字を単純に処理できないと考えているとコメントしました。Excel を使用して特殊文字を含む CSV ファイルを作成し、SSIS を使用してデータベースにインポートするを参照してください。SSISがこのケースを処理できず、唯一の回避策はデータに発生しないテキスト区切り文字を選択することであることが理解できないので、私はまだそれを信じることができず、私が間違っていることを願ってもう一度言及します.
ただし、NULL 値に関する主な質問に移らせてください。最近、File Input オブジェクトで「Retain Null Values」プロパティを設定しない限り、それを発見しました。
宛先テーブル オブジェクトの [Null 値を保持] プロパティ
NULL 値が検出されず、NULL 値がゼロ長の varchar 値または 0 になること (数値の宛先列の場合)。上記の例では、次の行の列が null 値を持つと見なします。
- 行 2 列 3
- 行 3、列 2
私の宛先データベースは長さゼロの varchar と null varchar を区別する SQL Server であるため、行 2 列 2 の値は null ではなく、長さゼロの varchar と見なします。ただし、これらのサンプル ファイルから、これらすべての列に NULL を許可する宛先テーブルにデータを転送すると、長さ 0 の文字列が NULL として読み込まれます。
「Retain NULLs」と「Keep Nulls」の設定は、列レベルではなくファイルおよびテーブル オブジェクト レベルにあるように見えるため、「Retain Nulls」を「オン」にする方法がないように思われます。 null があることを期待します。たとえば、42 個の varchar 列を含むファイルがあり、そのうちの 41 個については、null の代わりに空の文字列を使用することに満足していますが、単一の列については保持して NULL 値を区別したいとします。と空の文字列値、これを行う方法はありますか? null varchar 列と長さゼロの varchar 列値の両方が NULLS としてロードされているようです。
派生列変換またはスクリプト タスクを使用して値を変更することで、これを処理する最善の方法は何ですか? 誰かが C# スクリプトを手伝ってくれたり、どちらかのアプローチの詳細を提供したり、より良い方法を提案したりできますか?
CSV ファイルで NULL と長さ 0 の varchar 値を区別する方法はないと言っている SO に関するいくつかの投稿を見てきましたが、上記の例はあなたがそれを行う方法であり、それは単にあなたがどのように行うかの問題であると信じていますSSIS CSV パーサーを取得して適切に解析するか、パーサーが十分に機能している場合。