4

約100行の長さの2つのコンマ区切り値を含む非常に単純なテキストファイルがあります。このファイルは自動化されたプロセス(制御できません)によって作成され、SSISを介してこのファイルをSQLにインポートします。

ファイル内に空白行がある場合を除いて、私の仕事は非常にうまく機能します。これは、完全に空白であることを意味します。コンマやその他の文字はありません。これがファイルに存在する場合、その直後のレコードは、インポートされた値の前に2つのスペースを入れてインポ​​ートされます。

たとえば、テキスト行にこの「ABC、123」が含まれている場合、インポートされるSQL値は最初の列の「ABC」になります。TRIMステートメントで派生列を使用してこれを削除しようとしましたが、効果がありませんでした。REPLACE機能も機能しませんでした。本当に奇妙な部分は、データフローの宛先の直前にデータビューアを追加すると、値が正常に表示されることです。次のように、スペースが存在する場合はスペースを「見る」ことができるように、アスタリスクを追加しました。

"*" + REPLACE([Column 0]," ","") + "*"

これは非常に厄介な問題であり、何か提案をいただければ幸いです。ありがとうございました!

4

4 に答える 4

10

これを行う1つの方法があります。データフロータスクScript Component内で変換を使用して、データをクリーンアップできます。

  • これは、問題に類似したデータを表すサンプルファイルです。2つのスペースがあり、実際のデータがない2行目に注意してください。

問題のあるファイル

  • フラットファイルソースとOLEDB変換先を使用してファイルをテーブルに直接インポートすると、2番目の行がファイルにインポートされる前に空白の問題が発生しました。

無効なデータ

  • この問題を修正するには、フラットファイルとOLEDB変換先の間にスクリプトコンポーネント変換を導入する必要があります。スクリプトコンポーネントをドラッグアンドドロップするときは、[変換]を選択します。

変身

  • データフロータスクは次のようになります。

データフロータスク

  • スクリプトコンポーネントをダブルクリックして、スクリプト変換エディターを表示します。[入力]列で、ファイルから読み取られている最初の列を選択します。この場合、列はNameです。

入力列

  • CleansedData[入力と出力]セクションで、データ型という名前の新しい列を作成しますstring。この新しい列は、スペースのないクリーンな出力を保持します。

入力と出力

  • [スクリプト]セクションで、[スクリプトの編集]ボタンをクリックして、スクリプトエディターを表示します。

脚本

  • スクリプトエディタ内で、Input0_ProcessInputRow以下に示すようにメソッドのコードを変更します。このコードは、キャリッジリターンと改行を空白のテキストに置き換えてから、テキストを囲むスペースをトリミングします。

スクリプトコード

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    Row.CleansedData = Row.Name.Replace(@"\r\n", string.Empty).Trim();
}

スクリプトコード

  • CleansedData次に、OLE DB変換先で、列マッピングセクションの古い列をこの新しい列に置き換えます。

  • 上記の変更を行った後、空白を含む同じファイルに対してパッケージが実行されました。今回は、2行目の前にスペースは挿入されませんでした。

お役に立てば幸いです。

クリーンなデータ

于 2012-04-30T18:42:39.723 に答える
1

了解しました-他の誰かが別のフォーラムでこれに返信しました。私はこのように出くわした目に見えないCRLF文字を削除する必要がありました:

LTRIM(REPLACE(REPLACE([Column 0],"\n",""),"\r",""))
于 2012-04-30T19:40:17.407 に答える
1

これはとても役に立ちました!スペースをスクラブする必要はありませんでしたが、日時スクラブを行う必要がありました。この投稿では、必要なものを正確に示しました。

これはこれを投稿するための正しいフォーラムではないかもしれませんが、ここに私のコードのスニペットがあります:

    DateTime dt = DateTime.Now;
    string str_test = "";

    try
    {
        str_test = Row.SomeDate;

        if (str_test.Length == 8)
        {
            // date example: 20151231
            str_test = str_test.Insert(6, @"/");
            str_test = str_test.Insert(4, @"/");

            dt = Convert.ToDateTime(str_test);
            Row.CleansedDate = Row.SomeDate.;
        }
        else
        {
            // test for some other date
            dt = Convert.ToDateTime(str_test);
            Row.CleansedDate = Row.SomeDate;
        }
    }
    catch (Exception)
    {
        // this is not a date, return nothing
        Row.CleansedDate = null;
    }
于 2016-01-07T16:05:47.610 に答える
0

[列]メニューの[行区切り文字]ドロップボックスで{CR}{CL}を選択していることを確認してください。

于 2018-10-09T14:03:40.673 に答える