0

私はこの問題でしばらく立ち往生しており、手がかりがありません。日付を含む複数の CSV ファイルをアップロードしようとしていますが、日付を日付変数として保存したかったので、日付変数を使用して、スクリプトコンポーネントを使用してテーブルの列の一部を形成しましたが、日付を日付として作成する方法がわかりませんSSIS の変数。

CSV ファイルを Excel で開くと、次のようになります。

CSV データ 1:

Relative Date: 02/01/2013
Run Date: 15/01/2013

Organisation,AreaCode,ACount
Chadwell,RM6,50
Primrose,RM6,60

CSV データ 2:

Relative Date: 14/02/2013
Run Date: 17/02/2013

Organisation,AreaCode,ACount
Second Ave,E12,110
Fourth Avenue, E12,130

とを日付変数Relative DateとしてRun Date保存します。私は理にかなっていると思います。

4

1 に答える 1

2

最善の解決策は、制御フローでスクリプト タスクを使用することです。これにより、CSV ファイルを前処理します。最初の 2 行を簡単に解析し、必要な日付を取得して、事前に作成した 2 つの変数に格納できます。( http://msdn.microsoft.com/en-us/library/ms135941.aspx )

変数をスクリプト タスクに渡すときは、変数をReadWriteVariablesとして設定することが重要です。これらの変数は、後で任意の方法で使用してください。


更新されたクイック チュートリアル:

インポートするCSVファイルは同じディレクトリにあると思います:

CSV ファイル

指定したディレクトリと内部のファイルをループするForeach ループ コンテナー、各ファイルの 2 つの日付を解析するスクリプト タスク、およびファイルのインポートに使用するデータ フロー タスクを追加します。

ForEach ループ コンテナー

使用する変数を作成します - FileName/Path 用に 1 つ、取得する 2 つの日付用に 2 つ。これらは、プロセスで自動的に行われるため、入力しません。

パッケージ変数

Foreach ループ コンテナーをセットアップします。

  1. Foreach ファイル列挙子の選択
  2. ファイルを格納するディレクトリ フォルダーを選択します。(さらに良いのは、指定したパスを受け取る変数を追加することです。これは、式ビルダーを使用して列挙子に読み込むことができます)
  3. そのディレクトリで検索されるファイルのワイルドカード。

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 ファイルに対してスクリプト タスクを実行した結果。データ フロー タスクで好きなように日付を使用できるようになりました。ソース構成でインポートする必要のない最初の行をスキップしてください。

実行結果

于 2013-05-15T13:25:37.653 に答える