0

7 個または 8 個の .xls ファイルの毎日のダンプを取得するフォルダーがあります。これらすべてのファイルの中で、特定の名前の 2 つのファイルをロードする必要があります.. ABC_datestamp.xls と XYZ_datestamp.xls.

問題は、同じフォルダーに他のファイルが非常に多くあるため、これら 2 つのファイル名を分離できないことです。2 つ目の課題は、マネージャーが先週のすべてのファイルを一度にロードするように求めていることです。つまり、過去 7 日間のファイルのみを具体的にロードする必要があります。

現在、これらの特定の 7 つのファイルをフォルダーにコピーし、for each ループ コンテナーを使用してそれを読み込んでいます。

とにかく、スクリプト タスクを使用して、ABC_02-Dec-2011.xls、ABC_01-Dec-2011.xls、ABC_30-Nov-2011.xls のようなファイル名を生成できます.......過去 7 日間のファイルそれを変数として DATA FLOW TASK に渡しますか?

より良い提案はありますか?

多くの人が同様の質問をしていることは知っていますが、私は SSIS に不慣れで、適切な回答を見つけることができません。

どうもありがとう..

4

2 に答える 2

2

考えられるすべてのファイル名のリストを作成しようとするのではなく、フォルダー内のすべてのファイルをループ処理し、スクリプト タスクを使用して、さらに処理するファイルを決定します。

制御フローは次のようになります。 foreach ループ コンテナーのスクリーンショット

FELC_InputFolderContents変数マッピングを次のように設定します。 foreach ループ コンテナー設定のスクリーンショット

SCR_SetProcessFileFlagの構成: スクリプト タスク設定のスクリーンショット

SCR_SetProcessFileFlagのスクリプトは次のようになります。

    public void Main()
    {
        string targetFileFullPath = (string)Dts.Variables["User::TargetFileFullPath"].Value;
        string targetFileName = Path.GetFileName(targetFileFullPath);
        Dts.Variables["ProcessFileFlag"].Value = IsValidFileName(targetFileName);
        Dts.TaskResult = (int)ScriptResults.Success;
    }

    private bool IsValidFileName(string targetFileName)
    {
        bool result = false;
        if (Path.GetExtension(targetFileName) == "xls")
        {
            string fileNameOnly = Path.GetFileNameWithoutExtension(targetFileName);
            if (fileNameOnly.Substring(0, 4) == "ABC_" || fileNameOnly.Substring(0, 4) == "XYZ_")
            {
                string datePart = fileNameOnly.Substring(4);
                DateTime dateRangeStart = DateTime.Today.AddDays(-7);
                DateTime dateRangeEnd = DateTime.Today;
                DateTime fileDate;
                if (DateTime.TryParse(datePart, out fileDate)) 
                {
                    if (dateRangeStart <= fileDate && fileDate <= dateRangeEnd)
                    {
                        result = true;
                    }
                }
            }
        }
        return result;
    }

と の間の優先順位の制約は次のようSCR_SetProcessFileFlagDTT_ProcessSelectedFile構成 されます。優先順位制約設定のスクリーンショット

(明らかに、特定のロジックはIsValidFileName特定の要件によって異なります。)

于 2011-12-03T19:04:20.960 に答える
0

次のリンクの例では、フォルダー内のファイルをループ処理し、特定の月に一致するファイルをアーカイブする方法について説明しています。この例では、月の値に基づいてファイルに 、 という名前が付けられ、これらのファイルは、 などの月名を持つアーカイブ フォルダーに移動さmyfile 20-08-2011れます。myfile 13-09-2011AugustSeptember

この例では、ファイルをアーカイブするだけです。データをロードする場合は、データ フロー タスクを配置する必要があります。Foreach ループ コンテナー内。

例を見ていくと、問題を解決するためのアイデアが得られます。

特定のフォルダーからすべてのファイルを新しいフォルダーにコピーするパッケージを作成するにはどうすればよいですか?

以下は、フォルダーをループして Excel ファイルのデータをデータベースにロードする方法を示す例です。

名前が異なり、スキーマが同じExcelファイルをデータベースにインポートする方法は?

于 2011-12-02T17:32:57.677 に答える