我正在尝试创建一个SSIS包,它可以接受多个(已知的)文件结构,这些结构被转储到同一个处理文件夹中。我正在尝试从每个文件中提取AccountId
。
我遇到的问题是,我的数据流任务只适用于我为平面文件源设置的一个特定文件。在我的平面文件源中,我只使AccountId列可用,但这似乎并不能解决问题。
当前的SSIS包结构
Foreach循环:循环遍历指定文件夹中的所有文件
数据流任务:处理每个文件并存储在SQL表中
示例CSV文件结构
文件1:
Name | AccountId | Address | City | State
John | 154235 | 1234 | LA | CA
文件2:
Name | Address | City | State | AccountId | Phone
Kyle | 5825 | Test | KY | 534534 | 555-555-5555
文件:
Name | Address | City | State | Email | AccountId | Phone
Bob | 52345 | Fake | WY | t@test.com | 756313 | 444-444-4444
发布于 2018-07-04 03:34:27
平面文件源将使用连接管理器中定义的列的位置。它不会尝试从每个文件的头部单独拉取位置。
如果您想要创建一个可以处理列的不同位置的源,那么您可以购买一个可以处理此场景的组件,或者使用脚本组件编写自己的组件。
下面是一个设置为输出的脚本组件示例,它应该完成这项工作。您必须自己解决文件的解析问题,但这应该不是很难。不要忘记为文件路径配置一个变量,并将AccountId作为输出添加到输入和输出部分。
public override void CreateNewOutputRows()
{
int colIdx = -1;
var text = File.ReadAllText(Variables.FilePath); // Set in Script/ReadOnlyVariables
var rows = ParseText(text);
var firstRow = rows.FirstOrDefault().ToList();
// find matching row
for (var i = 0; i < firstRow.Count; i++)
{
if (firstRow[i] == "AccountId")
{
colIdx = i;
break;
}
}
foreach (var row in rows.Skip(1))
{
Output0Buffer.AddRow();
Output0Buffer.AccountId = row.Skip(colIdx).First(); // configure columns in output
}
}
public IEnumerable<IEnumerable<string>> ParseText(string text)
{
/** implement yourself. You can find examples online **/
}
https://stackoverflow.com/questions/51161233
复制相似问题