0

レポートのようにフォーマットされた Excel ファイルをインポートしています。つまり、一部の列は、次のように、属する行のグループごとに 1 回だけ入力されます。

    CaseID  |Date     |Code
     157207 |         |
            |8/1/2012 |64479
            |8/1/2012 |Q9967
            |8/1/2012 |99203

これらのグループ ヘッダーの 1 つ (上記の例では CaseID) を取得し、それをフィールドが空白の後続の行に使用し、次に遭遇した値を保存する必要があります。次のコードを使用して、変数 (User::CurrentCaseId) とスクリプト変換を追加しました。

public class ScriptMain : UserComponent
{
    string newCaseId;

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        if (!Row.CaseIDName_IsNull && Row.CaseIDName.Length > 0)
            newCaseId = Row.CaseIDName;
        else
            newCaseId = "DetailRow";
    }

    public override void PostExecute()
    {
        base.PostExecute();
            if (newClaimNumber != "DetailRow")
                Variables.CurrentCaseId = newCaseId;
    }

基本的に、存在する場合は値を読み取り、この変数に保存しようとしています。条件付き分割を使用して、CaseID のみを持つ行を破棄し、派生列を使用して変数値を新しい列に入れ、詳細行を完成させます。残念ながら、値は常に空白です (派生列の後にデータ ビューアーが配置されています)。変数を常に固定文字列に設定するようにスクリプトを修正しました - 派生列はまだ空白です。

これは良い計画のように思えました... MS フォーラムで、変数値を設定して、同じデータ フロー タスク内でその新しい値を使用することはできないというフィードバックを受け取りました。その場合、考えられる唯一の解決策は、存在する場合は CaseID をテーブルに書き出し、存在しない場合はそれを読み戻すことです。数百万行 (複数の Excel ワークシート) でそれを行うのは本当に嫌いです。より良いアイデアはありますか?

ベスト、スコット

4

1 に答える 1

0

これは、あなたにとって良い出発点になる可能性があります。

  1. 以下のファイルをソースとして使用しました。C:\Temp\5.TXT に保存しました
CaseID  |Date     |Code
157207  |         |
      |8/1/2012 |64479
      |8/1/2012 |Q9967
      |8/1/2012 |99203
157208  |         |
      |9/1/2012 |77779
      |9/2/2012 |R9967
      |9/3/2012 |11203
  1. コントロール フロー サーフェスに DFT を配置します。
  2. スクリプト コンポーネントを DFT のソースとして配置

    3.1. 入力と出力セクションに移動

    3.2. 出力を追加します。名前を MyOutput に変更します。

     3.2.1 Add the following output columns - CaseID, Date, Code
     3.2.1 The data types are four-byte unsigned integer [DT_UI4], string [DT_STR], string [DT_STR]
    
  3. 次に、スクリプト // スクリプトの編集に移動します。以下のコードを入れます。必ず追加してください

System.IO の使用;

名前空間エリアへ。

    public override void CreateNewOutputRows()
{

    string[] lines = File.ReadAllLines(@"C:\temp\5.txt");

    int iRowCount = 0;
    string[] fields = null;
    int iCaseID = 0;
    string sDate = string.Empty;
    string sCode = string.Empty;

    foreach (string line in lines)
    {
        if (iRowCount == 0)
        {
            iRowCount++;
        }
        else
        {
            fields = line.Split('|');
            //trim the field values
            for (int i = 0; i < fields.Length; i++)
            {
                fields[i] = fields[i].Trim();
            }

            if (!fields[0].Equals(string.Empty))
            {
                iCaseID = Convert.ToInt32(fields[0]);
            }
            else
            {
                MyOutputBuffer.AddRow();

                MyOutputBuffer.CaseID = iCaseID;
                MyOutputBuffer.Date = fields[1];
                MyOutputBuffer.Code = fields[2];
            }
        }
    }
}

}

  1. コードのテスト: スクリプト コンポーネントを配置した場所のすぐ下に Union All コンポーネントを追加します。Script コンポーネントの出力を Union All コンポーネントに接続します。データビューアを入れてください。

うまくいけば、これはあなたを助けるはずです. お知らせください。今日も同様の質問に回答しました。そちらもチェックしてみてください。それはコンセプトを固めるのに役立つかもしれません-IMHO。

于 2013-04-17T03:18:38.410 に答える