如何定义多行分隔符在SSIS一个平面文件连接? 例如用于包含该字符串的文本文件:多行分隔符
文明需要在所有时间;粗鲁不会被容忍。
我想有使用在此之后的两行“;”和'。'用于行定界符:
文明需要在所有时间
粗鲁将不会容忍
如何定义多行分隔符在SSIS一个平面文件连接? 例如用于包含该字符串的文本文件:多行分隔符
文明需要在所有时间;粗鲁不会被容忍。
我想有使用在此之后的两行“;”和'。'用于行定界符:
文明需要在所有时间
粗鲁将不会容忍
对于源数据,我创建了一个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的数据转换。
在输入列选项卡,选中InputRow并把它作为只读因此脚本可以访问值。如果您可以将其切换到ReadWrite并修改传出值,但这不适用于此类操作,那将会很不错。
默认情况下,脚本任务是同步组件,这意味着行和列之间存在1:1的关系。这将不适合您的需求,因此您需要将其切换到异步模式。我将Output 0重命名为OutputSplit,并将SynchronousInput的值从“Input 0(16)”更改为None。你的价值16可能会有所不同。
输出上有栏目的OutputSplit,添加一列与SplitRow DT_STR 8000
在你的脚本转化的名称,你只需要与ProcessInputRow方法有关。字符串类提供了一个拆分方法,它接收一组可用作拆分器的字符值。目前,它在数组初始化器中被硬编码,但它可以很容易地被定义为一个变量并传递到脚本中。这是留给海报的练习。
/// <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,瞧,
这将取决于你经过多少数据运行是一个相当内存密集型包。我确信有人可以做出优化,但这应该足以让你走。
因此,你已经有一个行定界符像一个换行符(\ n)定义,你想也分裂在一个分号?数据流中只有一行,还是需要复制列1-n,并将Civility行和Rudeness行加倍? – billinkc
@arz你的意思是使用';'和'\ r \ n'作为行分隔符吗? –