通过检查条件加载SSIS平面文件

时间:2013-07-11 04:44:47

标签: ssis

  • 我在一个文件夹中有10个平面文件(.dat格式),需要在预定的时间每天上传到数据库。
  • 所有与文件相关的信息都存在于数据库中,如文件名,文件路径,表名,列名和分隔符。
  • 我们需要检查每个文件是否存在,如果没有,需要记录条目“找不到文件”。
  • 如果文件存在,则需要检查预告片记录(文件中的最后一条记录,即Count = 00001000,它必须是该特定文件中记录数的计数)。
  • 如果预告片记录不存在,则需要记录条目“未找到预告片记录”。如果预告片记录显示零计数,则必须将日志条目设为“零计数”,如果计数为该文件与日志条目不匹配,需要“计数不匹配”。
  • 如果满足所有条件,则需要将数据加载到每个文件的数据库中。

请建议您实施上述方案的想法。感谢!!!

1 个答案:

答案 0 :(得分:1)

以下解决方案可以帮助您解决问题。

使用带有"Item" enumerator的For each循环容器。由于你有10个文件,如果缺少你需要加注,那么你应该使用它。文件枚举器只是遍历文件,不会引发任何错误。

以下是步骤。

使用变量创建以下SSIS包。

  1. FileFullPath
  2. IsValidated
  3. 对于每个循环,枚举器应配置为以下屏幕截图。

    收集中的配置: enter image description here

    变量部分

    配置 enter image description here

    容器内部有一个脚本任务。您必须提及FileFullPath作为只读变量,并IsValidate作为读取和写入,如下面的屏幕。

    enter image description here

    单击编辑脚本并插入以下代码。

    public void Main()
    {
            Dts.Variables["IsValidated"].Value = true;
    
            string fileFullPath = Dts.Variables["FileFullPath"].Value.ToString();
    
                if (!File.Exists(fileFullPath))
                {
                        var msg = String.Format("File is not available in location : {0}", fileFullPath);
                        Dts.Events.FireError(0, "Dat file loading", msg, string.Empty, 0);
                        Dts.TaskResult = (int)ScriptResults.Failure;
                }
    
                //Read last line
                String lstLine = File.ReadLines(fileFullPath).Last();
    
                int totalCount = 0;
                bool talierExists = int.TryParse(lstLine, out totalCount);
    
                if (!talierExists)
                {
                        var msg = String.Format("No tailer row found and last line is : {0}", lstLine);
                        Dts.Events.FireError(0, "Dat file loading", msg, string.Empty, 0);
                        Dts.TaskResult = (int)ScriptResults.Failure;
                }
    
                //Total count
                int fullCount = File.ReadLines(fileFullPath).Count();
    
                if (fullCount != totalCount)
                {
                        var msg = String.Format("No of count is not matching, tailer count = {0} and full count={1}");
                        Dts.Events.FireError(0, "Dat file loading", msg, string.Empty, 0);
                        Dts.TaskResult = (int)ScriptResults.Failure;
                }
    
                Dts.Variables["IsValidated"].Value = true;
    
                Dts.TaskResult = (int)ScriptResults.Success;
    }
    

    之后有你的数据流。将脚本任务与数据流连接,然后右键单击连接器,然后进行编辑和配置,如下所示。

    enter image description here

    您的SSIS包将如下所示。

    enter image description here

    希望这有帮助!