SSIS - 匹配CSV文件以在加载到目标之前控制文件

时间:2016-08-24 15:39:56

标签: sql-server ssis

我有一个每日CSV文件加载到目标表。但是,在加载发生之前,必须进行检查。控制csv文件具有日期列和记录计数列。检查基本上是使记录计数列与每日CSV文件上的列数和控制文件上的日期列匹配当前日期。

匹配成功后,每日CSV文件将加载到目标表。我被困在流量应该是什么样子。到目前为止,我已经完成了DailyCSV文件的行计数和控制文件的条件拆分,其中包含以下表达式。

([Current Date] == (DT_WSTR,12)GETDATE()) && ([Record Count] == (DT_WSTR,4)@[User::DailyCSVRowCount] 

但是输出只有控制文件的2列,我需要继续进程将CSV文件加载到目标表。

1 个答案:

答案 0 :(得分:0)

一种方法是使用脚本任务来处理控制文件验证。脚本任务从控制文件中读取值。然后,它将值与当前日期和每日源文件中存在的行数进行比较。下面是使用此方法的控制流程的屏幕截图。如果所有内容都检出,它会流向数据流任务,否则将流向发送邮件任务。

enter image description here

以下是我在脚本任务中用于完成所需验证的代码。它是用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 "";
    }
}