0

ForEachLoop コンテナーを使用して .CSV ファイルを処理する SSIS パッケージを作成しました。

すべてのcsvファイルには、最後の行に「END OF FILE」が含まれています。

最後の行に「END OF FILE」が含まれている場合、それらの CSV ファイルのみが処理されます。

どのようにそれを行うことができます。助けてください。

前もって感謝します。

4

3 に答える 3

2

変数を作成するcheck

Name   DataType  Value
check  int        0

以下のようなパッケージ デザインがあるとします。

ここに画像の説明を入力

スクリプト タスクはEnd of Filelast row

スクリプト タスクで、変数checkinReadWriteVariableセクションと出力変数 from ForEach container(変数名が であると仮定LoopFiles) を inに追加します。ReadOnlyVariables

スクリプト タスクで、次のコードを追加してファイルを読み取ります。ここここでファイルを読み取る方法はいくつかあります。

 public void Main()
    {
     int counter = 0;
     string loop=  Dts.Variables["User::LoopFiles"].Value.ToString();
     string line;
      using (StreamReader files = new StreamReader(file))
         {
             while((line = files.ReadLine()) != null)
                {
                    if (line.ToLower() == "End Of File".ToLower())
                      { 
                          Dts.Variables["User::check"].Value = 1;
                       }
                }
         }
 Dts.TaskResult = (int)ScriptResults.Success;
 }

緑の矢印の接続スクリプト タスクとデータ フロー タスクをダブルクリックします。優先順位ダイアログ ボックスが開き、次のように式を入力します。

ここに画像の説明を入力

于 2013-03-28T11:09:36.190 に答える
0

これを行う方法はいくつかあります。1つの方法は次のとおりです。

  1. 次の変数を作成します。

EOF_Found ブール値

Row_Count 整数

  1. フラット ファイル ソースを使用してデータをデータフローに取り込む
  2. 行数コンポーネントを使用して行数を Row_Count に追加し、後で最後の行を特定します
  3. スクリプト コンポーネントを使用して行をループし、各行のカウンターに 1 を追加します。
  4. カウンターが Row_Count の値と等しい場合 (つまり、最後の行を見ている場合)、「END OF FILE」が表示されると予想される列の値を確認します (フラット ファイル接続マネージャーの設定方法によって異なります)。「END OF FILE」に等しい場合は、EOF_Found の値を True に変更します。
  5. スクリプト コンポーネントの後に、EOF_Found の値を参照する派生列を追加します。
  6. 条件付き分割を使用して、派生列の値をチェックし、True の場合にのみ処理します
于 2013-03-28T10:36:44.180 に答える
0

このソリューションは、ファイル全体を 1 行ずつ読み取ることを回避します。完全を期すために、ここに Praveen のコードをマージしました。

    public void Main()
    {
        string line = ReadLastLine(@"c:\temp\EOF.cs");

         if (line.ToUpper() == "END OF FILE")
         { 
             Dts.Variables["User::check"].Value = 1;
         }

    Dts.TaskResult = (int)ScriptResults.Success;
    }

    public static string ReadLastLine(string path)
    {
        StreamReader stream = new StreamReader(path);
        string str = stream.ReadToEnd();
        int i = str.LastIndexOf('\n');
        string lastLine = str.Substring(i + 1);
        return lastLine;
    }
于 2013-03-28T22:27:11.330 に答える