将具有派生列的多个平面文件中的数据加载到数据库

时间:2015-08-28 14:39:05

标签: ssis packages

如何从不同的文件源加载数据,目标表应该有一个派生列作为File_Name,并且应该显示文件名,文件是从中加载到sql表中的数据。

例如: file1.txt包含

emp_id \ temp_name  1 abc

file2.txt包含

emp_id \ temp_name 2 adc

输出表应该包含 emp_id emp_name file_name 1 abc file1 2 adc file2

1 个答案:

答案 0 :(得分:0)

我写了几个SSIS包,正是你所寻求的。假设您正在应用带有“Foreach文件枚举器”的foreach循环(从文件夹中具有特定扩展名的每个文件中读取),您可以在Collection下设置一个对象变量,该变量将用作存储所有文件名的数组(包括完整路径)然后在Variable Mappings下设置第二个变量类型字符串(索引= 0),它将临时存储文件名(再次包括完整路径)。称之为FileWithFullPath。

现在需要应用一些步骤,因为您需要将文件名发送到数据库字段,并且文件名不能包含完整路径或扩展名(c:\ documents \ file1.txt变为file1)。为此,您需要按照定义的顺序将以下内容添加到foreach循环中。

  1. 添加脚本任务。在Script for ReadOnlyVariables下,添加FileWithFullPath变量。在ReadWriteVariables下,创建一个名为FileNameOnly的新变量。在这里,我们将读取当前包含完整路径的文件名,然后返回除路径和扩展名之外的文件名。选择编辑脚本,在这里您将应用以下C#代码来实现此目的。

  2. 添加“using System.IO;”到上面的区域命名空间。

  3. 在public void Main()下的大括号内,添加以下内容:

  4.     string PathandFileName = Dts.Variables["User::FileWithFullPath"].Value.ToString();
    
        string FileNameWithExtension = Path.GetFileName(PathandFileName);  //trim path
    
        string FileNameOnly = Path.GetFileNameWithoutExtension(FileNameWithExtension); //trim extension
    
    1. 将最终字符串值分配给新变量。

      Dts.Variables["User::FileNameOnly"].Value = FileNameOnly;
      
    2. 保存并构建代码,然后退出。

    3. 最后,在“控制流”选项卡下,将一个数据流任务添加到foreach循环中。选择“数据流”选项卡,添加源和目标,但在两者之间添加“派生列”任务。在这里,您将创建一个名为FileName的新列,并将其刚刚填充在名为User :: FileNameOnly的C#代码中的新变量拖入其表达式中。然后,您将映射到目标数据库表中的Filename列以及从该文件中读取的其他列。

    4. 试一试,如果您有任何问题,请告诉我。

      感谢。