我有一个每日CSV文件加载到目标表。但是,在加载发生之前,必须进行检查。控制csv文件具有日期列和记录计数列。检查基本上是使记录计数列与每日CSV文件上的列数和控制文件上的日期列匹配当前日期。
匹配成功后,每日CSV文件将加载到目标表。我被困在流量应该是什么样子。到目前为止,我已经完成了DailyCSV文件的行计数和控制文件的条件拆分,其中包含以下表达式。
([Current Date] == (DT_WSTR,12)GETDATE()) && ([Record Count] == (DT_WSTR,4)@[User::DailyCSVRowCount]
但是输出只有控制文件的2列,我需要继续进程将CSV文件加载到目标表。
答案 0 :(得分:0)
一种方法是使用脚本任务来处理控制文件验证。脚本任务从控制文件中读取值。然后,它将值与当前日期和每日源文件中存在的行数进行比较。下面是使用此方法的控制流程的屏幕截图。如果所有内容都检出,它会流向数据流任务,否则将流向发送邮件任务。
以下是我在脚本任务中用于完成所需验证的代码。它是用c#编写的。此代码考虑了控制文件和源文件中的标头记录。我想赞扬ReadFile函数的博客文章here。
public void Main()
{
string errInfo = "";
string controlFilePath = "Z:\\StackOverFlow\\Control.csv";
string sourceFilePath = "Z:\\StackOverFlow\\Source.csv";
string fileContent = ReadFile(controlFilePath, errInfo);
string[] parsedContent = fileContent.Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
int controlRows = Int32.Parse(parsedContent[1].Split(',')[0]);
string controlDate = parsedContent[1].Split(',')[1];
int sourceRows = -1;
using (var reader = File.OpenText(sourceFilePath))
{
while (reader.ReadLine() != null)
{
sourceRows++;
}
}
if (DateTime.Parse(controlDate).Date.Equals(DateTime.Now.Date) && controlRows == sourceRows)
{
Dts.TaskResult = (int)ScriptResults.Success;
}
else
{
Dts.TaskResult = (int)ScriptResults.Failure;
}
}
public String ReadFile(String FilePath, String ErrInfo)
{
String strContents;
StreamReader sReader;
try
{
sReader = File.OpenText(FilePath);
strContents = sReader.ReadToEnd();
sReader.Close();
return strContents;
}
catch (Exception e)
{
MessageBox.Show(ErrInfo);
ErrInfo = e.Message;
return "";
}
}