【发布时间】: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
【问题讨论】:
我如何从不同的文件源加载数据,并且目标表应该有一个派生列作为 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 包,完全符合您的要求。假设您正在应用带有“Foreach 文件枚举器”的 foreach 循环(从文件夹中具有特定扩展名的每个文件中读取),您可以在 Collection 下设置一个对象变量,该变量将用作存储所有文件名的数组(包括完整路径),然后在变量映射下设置第二个字符串类型的变量(索引 = 0),它将临时存储文件的名称(再次包括完整路径)。称之为 FileWithFullPath。
现在需要应用一些步骤,因为您需要将文件名发送到数据库字段并且文件名不能包含完整路径或扩展名(c:\documents\file1.txt 变为 file1)。为此,您需要按照定义的顺序将以下内容添加到您的 foreach 循环中。
添加脚本任务。在 ReadOnlyVariables 脚本下,添加 FileWithFullPath 变量。在 ReadWriteVariables 下,创建一个名为 FileNameOnly 的新变量。在这里,我们将读取当前包含完整路径的文件名,然后返回不包括路径和扩展名的文件名。选择编辑脚本,在这里您将应用以下 C# 代码来实现这一点。
添加“使用 System.IO;”到上面的区域命名空间。
在 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
将最终字符串值分配给新变量。
Dts.Variables["User::FileNameOnly"].Value = FileNameOnly;
保存并构建代码,然后退出。
最后,在控制流选项卡下,将数据流任务添加到 foreach 循环中。选择数据流选项卡,添加源和目标,但在两者之间添加派生列任务。在这里,您将创建一个名为 FileName 的新列,并将刚刚在 C# 代码中填充的名为 User::FileNameOnly 的新变量拖到其表达式中。然后,您将映射到目标数据库表中的 Filename 列以及从该文件中读取的其他列。
试一试,如果您有任何问题,请告诉我。
谢谢。
【讨论】: