如何在SSIS中为平面文件连接定义多行分隔符? 例如,对于包含此字符串的文本文件:
任何时候都需要文明;粗鲁是不能容忍的。
我希望在使用';'和'。'进行行分隔后使用这两行:
始终需要文明
粗鲁无法容忍
答案 0 :(得分:3)
对于源数据,我创建了一个3行文件
Civility is required at all times; rudeness will not be tolerated.
The quick brown fox jumped over the lazy dogs.
I am but a single row with no delimiter beyond the carriage return
我在下面采用的一般方法是使用格式为Ragged Right的平面文件连接管理器,我的标题行分隔符为{CR} {LF}。我定义了一列,InputRow为String 8000.YMMV
在我的数据流中,在平面文件源之后,我添加了一个脚本组件作为名为Split Rows的数据转换。
在Input Columns选项卡上,检查InputRow并将其保留为ReadOnly,以便脚本可以访问该值。如果您可以将其切换到ReadWrite并修改传出值,那将是很好的,但这不适用于此类操作。
默认情况下,脚本任务是同步组件,这意味着行和行之间存在1:1的关系。这不符合您的需求,因此您需要将其切换到异步模式。我将Output 0重命名为OutputSplit,并将SynchronousInput的值从“Input 0(16)”更改为None。您对16的价值可能会有所不同。
在OutputSplit的输出列上,添加名称为SplitRow DT_STR 8000的列。
在脚本转换中,您只需要关注ProcessInputRow方法。字符串类提供了一种split方法,该方法获取将用作拆分器的字符值数组。目前,它在下面的数组初始化程序中进行了硬编码,但它可以很容易地定义为变量并传递给脚本。这留给了海报。
/// <summary>
/// we have to make this an async script as 1 input row can be many output rows
/// </summary>
/// <param name="Row"></param>
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
string[] results = Row.InputRow.Split(new char[]{';', '.'});
foreach (string line in results)
{
// Remove this line if it is desirable to have empty strings in the buffer
if (!string.IsNullOrEmpty(line))
{
OutputSplitBuffer.AddRow();
// You might want to call trim operations on the line
OutputSplitBuffer.SplitRow = line;
}
}
}
完成所有这些后,我击中了F5,瞧,
这将是一个相当占用内存的程序包,具体取决于您运行的数据量。我确信可以进行优化,但这足以让你前进。