SSIS包-从多个源文件中获取一列

时间:2018-07-03 18:50:45

标签: ssis

我正在尝试创建一个SSIS包,该包可以接受转储到同一处理文件夹中的多个(已知)文件结构。我正在尝试从每个文件中提取AccountId

我遇到的问题是我的数据流任务仅适用于我为平面文件源设置的一个特定文件。在我的平面文件源中,我仅使AccountId列可用,但这似乎无法解决问题。

当前的SSIS包结构

Foreach循环:循环通过特定文件夹中的所有文件

Foreach Loop

数据流任务:处理每个文件并将其存储在SQL表中

Dataflow Task

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

1 个答案:

答案 0 :(得分:2)

平面文件源将使用连接管理器中定义的列的位置。它不会尝试分别从每个文件的标题中提取位置。

如果要创建一个可以处理列的不同位置的源,则可以购买可以处理这种情况的组件,也可以使用脚本组件自己编写。

下面是脚本组件集的示例,该脚本组件应作为应做的输出。您必须自己弄清楚文件的解析,但这并不难。只是不要忘记为文件路径配置变量,并在 Inputs and Outputs 部分中将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 **/
}