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 将相应地拆分数据。
我是 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 将相应地拆分数据。