【问题标题】:Loading data from multiple flatfiles with a derived column to a database将具有派生列的多个平面文件中的数据加载到数据库
【发布时间】:2015-08-28 14:39:05
【问题描述】:

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

例如: file1.txt 包含

emp_id emp_name 1个ABC

file2.txt 包含

emp_id emp_name 2个ADC

输出表应该包含 emp_id emp_name 文件名 1个ABC文件1 2 adc 文件2

【问题讨论】:

标签: ssis packages


【解决方案1】:

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

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

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

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

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

;

    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 的新列,并将刚刚在 C# 代码中填充的名为 User::FileNameOnly 的新变量拖到其表达式中。然后,您将映射到目标数据库表中的 Filename 列以及从该文件中读取的其他列。

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

谢谢。

【讨论】:

  • 您好,感谢您的帮助。但我想在没有脚本任务的情况下解决这个问题。如果能帮上忙将不胜感激。
  • C# 脚本是从文件名中动态修剪路径(无论子文件夹的数量)和扩展名(长度是否为三个或更多字符)的最佳方式。否则,唯一的选择是使用派生列中的表达式应用一些硬编码。您可以应用 RTRIM 来修剪句点和三个字符扩展名,然后应用 TOKEN 来计算提取文件名所需的“\\”文件夹分隔符。查看令牌链接示例:allaboutmssql.com/2013/08/…
猜你喜欢
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多