最善の解決策は、制御フローでスクリプト タスクを使用することです。これにより、CSV ファイルを前処理します。最初の 2 行を簡単に解析し、必要な日付を取得して、事前に作成した 2 つの変数に格納できます。( http://msdn.microsoft.com/en-us/library/ms135941.aspx )
変数をスクリプト タスクに渡すときは、変数をReadWriteVariablesとして設定することが重要です。これらの変数は、後で任意の方法で使用してください。
更新されたクイック チュートリアル:
インポートするCSVファイルは同じディレクトリにあると思います:
指定したディレクトリと内部のファイルをループするForeach ループ コンテナー、各ファイルの 2 つの日付を解析するスクリプト タスク、およびファイルのインポートに使用するデータ フロー タスクを追加します。
使用する変数を作成します - FileName/Path 用に 1 つ、取得する 2 つの日付用に 2 つ。これらは、プロセスで自動的に行われるため、入力しません。
Foreach ループ コンテナーをセットアップします。
- Foreach ファイル列挙子の選択
- ファイルを格納するディレクトリ フォルダーを選択します。(さらに良いのは、指定したパスを受け取る変数を追加することです。これは、式ビルダーを使用して列挙子に読み込むことができます)
- そのディレクトリで検索されるファイルのワイルドカード。
また、列挙子が生成する各ファイル名を、前に作成した変数にマップする必要もあります。
Script Taskを開き、3 つの変数をReadWriteVariablesセクションに追加します。これは重要です。そうしないと、変数に書き込むことができなくなります。
これは、私が目的に使用したスクリプトです。必ずしも最良であるとは限りませんが、この例では機能します。
public void Main()
{
string filePath = this.Dts.Variables["User::FileName"].Value.ToString();
using (StreamReader reader = new System.IO.StreamReader(filePath))
{
string line = "";
bool getNext = true;
while (getNext && (line = reader.ReadLine()) != null)
{
if(line.Contains("Relative Date"))
{
string date = getDate(line);
this.Dts.Variables["User::RelativeDate"].Value = date;
// Test Event Information
bool fireAgain = false;
this.Dts.Events.FireInformation(1, "Rel Date", date,
"", 0, ref fireAgain);
}
else if (line.Contains("Run Date"))
{
string date = getDate(line);
this.Dts.Variables["User::RunDate"].Value = date;
// Test Event Information
bool fireAgain = false;
this.Dts.Events.FireInformation(1, "Run Date", date,
"", 0, ref fireAgain);
break;
}
}
}
Dts.TaskResult = (int)ScriptResults.Success;
}
private string getDate(string line)
{
Regex r = new Regex(@"\d{2}/\d{2}/\d{4}");
MatchCollection matches = r.Matches(line);
return matches[matches.Count - 1].Value;
}
2 つの CSV ファイルに対してスクリプト タスクを実行した結果。データ フロー タスクで好きなように日付を使用できるようになりました。ソース構成でインポートする必要のない最初の行をスキップしてください。