エラーの再現
まず、 Notepad++ エディターを使用してこのエラーを再現する手順を示したいと思います。
TestNUL
質問に投稿されたスクリーンショットに似たデータを含むというテキストファイルを作成しました(NUL
オブジェクトがあるべき場所にカンマが配置されています):
次に、編集メニューストリップに移動します>>キャラクターパネル
ASCII 文字パネルが表示されたら、NULL
値をダブルクリックしてテキストに追加します。
テキストファイルは次のようになります。
次のリンクを使用して、ファイルをダウンロードできます。
Notepad++ を使用して NUL 文字を削除する
この文字を削除するには、Notepad++ を開き、[ Ctrl+ ] をクリックして [H検索と置換] ダイアログを開きます。\x00
次に、正規表現の使用を選択し、空の文字列に置き換えます。
すべてのNUL
文字が削除されます。
複数のファイルを検索して置換
複数のファイルでこの文字を検索して置換する場合は、メモ帳 ++ を使用して、ファイル内検索機能を使用してこれを行うことができます。
SSIS 内でのプロセスの自動化
この問題はデータのプレビュー中ではなく実行時に発生するため、データ フロー タスクの前にスクリプト タスクを追加するだけで、すべての\x00
値を空の文字列に置き換えることができます。フラット ファイル接続マネージャーからテキスト ファイル パスを読み取るか、変数に格納することができます。同様の C# コードを使用できます。
public void Main()
{
string FilePath = Dts.Connections["SourceConnection"].ConnectionString;
string text = System.IO.File.ReadAllText(FilePath);
text = text.Replace(Convert.ToChar(0x0).ToString(), "");
System.IO.File.WriteAllText(FilePath, text);
Dts.TaskResult = (int)ScriptResults.Success;
}
大きなテキスト ファイルを操作している場合は、クラスを使用System.IO.StreamReader
して、関数System.IO.StreamWriter
を使用してファイルを 1 行ずつ読み取ることができReadLine()
ます。
実験
パッケージを作成し、2 つのフラット ファイル接続マネージャーを追加しました。ソースはファイルから読み取り、宛先は同じ構造TestNUL.txt
の新しいファイルを作成します。TestNUL_edited.txt
上記のコードでスクリプト タスクを追加し、データ フロー タスクにデータ ビューアーを追加しました。次のスクリーンショットは、行が破損していないことを示しています。
また、次のスクリーンショットはNUL
、スクリプト タスクの実行後にソース ファイルから値が削除される様子を示しています。
参考文献