您最好的解决方案是在您的控制流中使用脚本任务。有了这个,您将预处理您的 CSV 文件 - 您可以轻松解析前两行,检索您想要的日期并将它们存储到预先创建的两个变量中。( http://msdn.microsoft.com/en-us/library/ms135941.aspx )
重要的是确保在将变量传递到脚本任务时将它们设置为ReadWriteVariables。之后以您希望的任何方式使用这些变量。
更新的快速演练:
我假设您要导入的 CSV 文件将位于同一目录中:
添加一个Foreach 循环容器,它将遍历指定目录和内部的文件,一个脚本任务将负责解析每个文件中的两个日期,一个数据流任务将用于文件导入。
创建您将使用的变量 - 一个用于文件名/路径,两个用于您要检索的两个日期。这些您不会填写,因为它将在您的流程中自动完成。
设置你的Foreach 循环容器:
- 选择一个 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中以您喜欢的任何方式使用日期。确保跳过源配置中不需要导入的第一行。