首页 > 解决方案 > SSIS 包 - 从多个源文件中获取一列

问题描述

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

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

当前的 SSIS 包结构

Foreach 循环:循环指定文件夹中的所有文件

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

标签: ssis

解决方案


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

如果您想创建一个可以处理列的不同位置的源,那么您可以购买可以处理这种情况的组件,或者使用脚本组件编写自己的组件。

下面是一个脚本组件的示例,它设置为应该完成这项工作的输出。您必须自己弄清楚文件的解析,但这不应该那么难。只是不要忘记为文件路径配置一个变量,并在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 **/
}

推荐阅读