1

SSIS に関する興味深い課題があります。各ファイル列挙子を使用して、最近作成されたサブフォルダーを選択し、各ファイルを反復処理する必要があります。

おそらく、例がよりよく説明するでしょう。フォルダは次のようになります。

c:\data\2011-0703

c:\data\2011-0626

c:\data\2011-0619

For each file 列挙子で最新のフォルダーを選択するにはどうすればよいでしょうか? これは、作成日を確認するか、ファイル名を比較することによって行うことができます。

私はそれが列挙子の式で行われると推測していますが、どうやってうまくいかないのですか! ネット上でも何も見つかりませんでした。

ありがとう

4

2 に答える 2

5

の助けを借りてこれを実現できるオプションの 1 つを次に示しますScript Task。次の例は、これを行う方法を示しています。この例は、SSIS 2008 R2 で作成されました。

段階的なプロセス:

  1. スクリーンショット # 1に示すように、フォルダ パス2011-06192011-0626とという名前の 3 つのフォルダを作成します。各フォルダーの値をメモします。2011-0703C:\temp\Date created

  2. スクリーンショット # 2~ # 4に示すように、各フォルダーにいくつかのファイルを配置します。

  3. SSIS パッケージで、スクリーンショット # 5に示すように 4 つの変数を作成します。変数RootFolderに値を設定しますC:\temp\(この場合、これは c:\data になります)。変数FilePatternに value を設定します*.*。変数RecentFolderには、スクリプト タスクの最近のフォルダー パスが割り当てられます。設計時のエラーを回避するには、変数RecentFolderに有効なファイル パスを割り当てます。変数FilePathには、最近使用したフォルダーでファイルがループされるときに値が割り当てられます。

  4. SSIS パッケージに、スクリプト タスクを配置します。スクリプト タスク内の Main() メソッドを、「スクリプト タスク コード (最近使ったフォルダーを取得):」セクションにあるスクリプト タスク コードに置き換えます。このスクリプトは、ルート フォルダー内のフォルダーのリストを取得し、ループして作成日時をチェックし、最後に作成されたフォルダーを選択します。最近作成されたフォルダー パスは、変数RecentFolderに格納されます。

  5. SSIS パッケージに Foreach ループ コンテナーを配置し、スクリーンショット # 6と # 7に示すように構成します。

  6. Foreach ループ コンテナー内にスクリプト タスクを配置します。スクリプト タスク内の Main() メソッドを、セクションスクリプト タスク コード (ファイル名の表示)で指定されたスクリプト タスク コードに置き換えます。このスクリプトは、最近作成されたフォルダー内のファイルの名前を表示するだけです。

  7. すべてのタスクが設定されると、パッケージはスクリーンショット # 8に示すようになります。

  8. スクリーンショット # 9~ # 11は、パッケージが最近作成されたフォルダー2011-0703内のファイル名を表示することを示しています。

それが役立つことを願っています。

スクリプト タスク コード (最近使ったフォルダーを取得):

SSIS 2008 以降でのみ使用できるC#コード。

public void Main()
{
    Variables varCollection = null;

    Dts.VariableDispenser.LockForRead("User::RootFolder");
    Dts.VariableDispenser.LockForWrite("User::RecentFolder");
    Dts.VariableDispenser.GetVariables(ref varCollection);

    string rootFolder = varCollection["User::RootFolder"].Value.ToString();
    DateTime previousFolderTime = DateTime.MinValue;
    string recentFolder = string.Empty;

    foreach (string subFolder in System.IO.Directory.GetDirectories(rootFolder))
    {
        DateTime currentFolderTime = System.IO.Directory.GetCreationTime(subFolder);
        if (previousFolderTime == DateTime.MinValue || previousFolderTime <= currentFolderTime)
        {
            previousFolderTime = currentFolderTime;
            recentFolder = subFolder;
        }
    }

    varCollection["User::RecentFolder"].Value = recentFolder;

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

スクリプト タスク コード (表示ファイル名):

SSIS 2008 以降でのみ使用できるC#コード。

public void Main()
{
    Variables varCollection = null;

    Dts.VariableDispenser.LockForRead("User::FilePath");
    Dts.VariableDispenser.GetVariables(ref varCollection);

    MessageBox.Show(varCollection["User::FilePath"].Value.ToString(), "File Path");

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

スクリーンショット #1:

1

スクリーンショット #2:

2

スクリーンショット #3:

3

スクリーンショット #4:

4

スクリーンショット #5:

5

スクリーンショット #6:

6

スクリーンショット #7:

7

スクリーンショット #8:

8

スクリーンショット #9:

9

スクリーンショット #10:

10

スクリーンショット #11:

11

于 2011-07-13T19:09:58.987 に答える
0

フォルダーを反復処理します。最初の名前を保存します。その保存された値を後続の各フォルダーの名前と比較します。次のフォルダがより新しい場合は、その名前を入れ替えて続行します。最後に、保存された値は最新のフォルダーの名前になります (作成日を比較する場合は、フォルダー名と作成日の両方を保存する必要があります)。

その後、保存された値を 2 番目の反復ループの引数として使用できます。

于 2011-07-04T13:30:12.167 に答える