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 DateRun Date存储为日期变量。我希望我是有道理的。

4

1 回答 1

2

您最好的解决方案是在您的控制流中使用脚本任务。有了这个,您将预处理您的 CSV 文件 - 您可以轻松解析前两行,检索您想要的日期并将它们存储到预先创建的两个变量中。( http://msdn.microsoft.com/en-us/library/ms135941.aspx )

重要的是确保在将变量传递到脚本任务时将它们设置为ReadWriteVariables。之后以您希望的任何方式使用这些变量。


更新的快速演练:

我假设您要导入的 CSV 文件将位于同一目录中:

CSV 文件

添加一个Foreach 循环容器,它将遍历指定目录和内部的文件,一个脚本任务将负责解析每个文件中的两个日期,一个数据流任务将用于文件导入。

ForEach 循环容器

创建您将使用的变量 - 一个用于文件名/路径,两个用于您要检索的两个日期。这些您不会填写,因为它将在您的流程中自动完成。

包变量

设置你的Foreach 循环容器

  1. 选择一个 Foreach 文件枚举器
  2. 选择将包含您的文件的目录文件夹。(更好的是,添加一个变量,该变量将采用您指定的路径。然后可以使用其表达式构建器将其读入枚举器)
  3. 将在该目录中搜索的文件的通配符。

Foreach 循环设置

您还需要将枚举器生成的每个文件名映射到您之前创建的变量。

变量映射

打开您的Script Task,将三个变量添加到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;
}

对两个 CSV 文件执行脚本任务的结果。现在可以在Data Flow Task中以您喜欢的任何方式使用日期。确保跳过源配置中不需要导入的第一行。

执行结果

于 2013-05-15T13:25:37.653 回答