SSIS 使用条件拆分或脚本拆分平面文件中的行

SSIS Split rows in a flatfile using conditional split or script

我是 SSIS 的新手,非常感谢您的想法或解决方案。

我有一个平面文件,第一行是文件详细信息(不是 header)。第二行以后是实际数据。

资料说明

First-row format=Supplier_name,日期,文件记录数 例如:

Supplier_name^06022017^3
ID1^Member1^NEW YORK^050117^50.00^GENERAL^ANC ID2^Member2^FLORIDA^050517^50.00^MOBILE^ANC ID3^Member3^SEATTLE^050517^80.00^MOBILE^ANC
EOF

问题

我想使用 SSIS 将第一行拆分为输出 1,将第二行拆分为输出 2。

在条件拆分的帮助下,我认为我可以做到这一点。但我不确定为了拆分行要给出什么条件。我应该尝试多播吗?

谢谢

我会通过使用脚本任务(在数据流之前)读取第一行并用它做任何你想做的事情来处理这个问题。

然后在数据流任务中,我会将平面文件源设置为忽略第一行并将第二行作为数据导入。

我首先要确保您的平面文件连接中的列数正确: 编辑平面文件连接 -> 高级选项卡,按新建按钮添加列。在您的示例中,您应该有 7 个,第 0 列到第 6 列。

现在添加条件拆分和 ass 两个 case 语句:

Output Name      Condition
HeaderRow        [Column 0] == "Supplier_Name"
DetailRow        [Column 0] != "Supplier_Name"

现在将它们路由到输出 1 和输出 2

扩展 Tab Allerman 的回答。

对于我们的项目,我们在 Execute process task 中使用了一个 power shell 脚本组件,其中 运行 是一个简单的 power shell 命令来获取文件的第一行.

请参阅此 MSDN blog,了解如何 运行 增强 shell 脚本。

Power shell 获取第一行的脚本

Get-Content C:\foo\yourfolderpath\yourfilename.txt -First 1

此说明仅对像您这样的情况有帮助,但通常有助于避免处理不正确 header 的大文件(GB 及以上)。这个简单的功能 shell 执行时间为几毫秒,而大多数 processes/scripts 需要将整个文件加载到内存中,这会减慢速度。

谢谢大家。这是一个替代解决方案

我使用 SSIS 中的脚本组件来执行此操作。

步骤 1: 创建一个名为 RowNumber 的变量。

第 2 步: 然后添加一个脚本组件,该组件将添加一个额外的列并增加行号。

SSIS 脚本组件

 private int m_rowNumber;
public override void PreExecute()
{
    base.PreExecute();
    m_rowNumber = 0;
}

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    m_rowNumber++;
    Row.RowNumber = m_rowNumber;
}

Step3:使用Script组件的输出作为条件拆分的输入,创建一个RowNumber == 1的条件。

Multicast 将相应地拆分数据。