6

テキスト ファイルからデータベースにデータをロードしようとしています。NUL私のソース ファイルには、何らかの理由でnull 文字が含まれています(図 1)。

写真1

すべてのフィールドを 1 つの列 (で区切られた{CR}{LF}) として作成するだけです。次に、データのプレビューを行います。

写真2

データはまさに私たちが必要としているものです。しかし、パッケージを実行すると、データ プレビューで見たものとは異なり、データが変更されました。データを表示するデータ ビューアーを追加しました。

写真3

写真4

最初の行で数字の 1 が消えます (赤を参照)。フラットファイルの読み込みは文字で終わるようですNUL。しかし、私の行区切り文字は{CR}{LF}です。最後に数字の 1 が消えるのは意味がありません。その理由を誰か教えてもらえますか?

4

2 に答える 2

4

エラーの再現

まず、 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、スクリプト タスクの実行後にソース ファイルから値が削除される様子を示しています。

ここに画像の説明を入力

参考文献

于 2019-08-22T20:57:09.137 に答える