当SSIS中的C#转换需要同步时,在输出缓冲区中使用AddRow()?

当SSIS中的C#转换需要同步时,在输出缓冲区中使用AddRow()?,c#,ssis,C#,Ssis,首先,我对SSIS和C#都是新手,所以对于新手犯的错误我深表歉意。我试图通过从具有可变长度页眉和页脚的输入文件中用特定分隔符拆分一列来混淆视听 例如,Input0Buffer有一列。实际数据前始终有一行以短语“STARTDATA”开头,括号中有一行以“ENDDATA”开头 一个输入列包含由|分隔的5位数据。我不在乎其中的两个专栏 基本上,输入文件如下所示: 农庄 头颅凝灰岩 更多垃圾 起始数据 ID1 |垃圾|东西|苹果|奶酪 ID2 |獾|垃圾|梨|酸奶 到目前为止,我已经尝试在C#trans

首先,我对SSIS和C#都是新手,所以对于新手犯的错误我深表歉意。我试图通过从具有可变长度页眉和页脚的输入文件中用特定分隔符拆分一列来混淆视听

例如,Input0Buffer有一列。实际数据前始终有一行以短语“STARTDATA”开头,括号中有一行以“ENDDATA”开头

一个输入列包含由|分隔的5位数据。我不在乎其中的两个专栏

基本上,输入文件如下所示:

农庄

头颅凝灰岩

更多垃圾

起始数据

ID1 |垃圾|东西|苹果|奶酪

ID2 |獾|垃圾|梨|酸奶

到目前为止,我已经尝试在C#transformer中使用一些逐行逻辑,我想我对此很满意,但我不知道如何让它输出分割数据。代码如下

bool passedSOD;
bool passedEOD;

public void ProcessRow(Input0Buffer data)      
{

string Col1, Col2, Col3;

if (data.Column0.StartsWith("ENDDATA")) 
{
passedEOD = true;
}

if (passedSOD && !passedEOD)
{
var SplitData = data.Column0.Split('|');

Col1 = SplitData[0];
Col2 = SplitData[3];
Col3 = SplitData[4];

//error about Output0Buffer not existing in context
Output0Buffer.Addrow();
Output0Buffer.prodid = Col1;
Output0Buffer.fruit = Col2;
Output0Buffer.dairy = Col3;
}

if (data.Column0.StartsWith("STARTDATA"))
{
passedSOD = true; 
} 
}
如果我将输出更改为asynchronous,它会停止当前上下文中不存在的Output0Buffer错误,并运行,但会给我0行输出-大概是因为我需要它是同步的,以便在设置时处理每一行


非常感谢您的帮助。

您只需检查行中是否包含“|”即可缩短代码

if(Row.Column0.Contains("|")
{
     string[] cols = Row.Column0.Split('|');

     Output0Buffer.AddRow();
     Output0Buffer.prodid = cols[0];
     Output0Buffer.fruit = cols[3];
     Output0Buffer.dairy = cols[4];
}
就像比尔说的。确保这是一个转换组件,而不是目标。您可以选择源、转换和目标


您也可能希望将其作为不同的输出。否则,您将需要有条件地拆分“额外”行。

感谢您的回答-这是一种转换,感谢您缩短了方式,但是页眉和页脚格式不好,可能也包含垃圾字符,因此我不敢冒险在行中查找。但我肯定会将其存储起来,以便下次处理格式更好的文件

我在论坛外得到了回复,所以我想我应该回答我自己的问题,以防其他人有类似的问题

请注意:

  • 这是一个转变

  • 在脚本转换编辑器的“输入和输出”部分中,将输出设置为SynchronousInputID=None

  • 我的输入名为input,包含一个名为RawData的列

  • 我的输出称为GenOutput,有三列

  • 虽然输入文件实际上只有5个字段,但在每行末尾都有一个尾随|,因此这将计为6

将synchronous设置为None意味着现在可以在上下文中识别Output0Buffer

适用于我的代码是:

bool passedSOD;
bool passedEOD;

public override void_InputProcessInputRow(InputBuffer Row)
{
if (Row.RawData.Contains("ENDDATA"))
{
passedEOD = true;
GenOutputBuffer.SetEndOfRowset();
}

//IF WE HAVE NOT PASSED THE END OF DATA, BUT HAVE PASSED THE START OF DATA, SPLIT THE ROW
if (passedSOD && !passedEOD)
{
var SplitData = Row.RawData.Split('|');

//ONLY PROCESS IF THE ROW CONTAINS THE RIGHT NUMBER OF ELEMENTS I.E. EXPECTED NUMBER OF DELIMITERS
if (SplitData.Length == 6)
{
GenOutputBuffer.AddRow();
GenOutputBuffer.prodid = SplitData[0];
GenOutputBuffer.fruit = SplitData[3];
GenOutputBuffer.dairy = SplitData[4];
}

//SILENTLY DROPPING ROWS THAT DO NOT HAVE RIGHT NUMBER OF ELEMENTS FOR NOW - COULD IMPROVE THIS LATER
}

if (Row.RawData.Contains("STARTDATA"))
{
passedSOD = true;
}
}

现在,我必须解决如何将其他字段中的一个从字符串转换为十进制,但十进制为null,如果有人在该字段中转储了“N.a”,则允许它输出null:D

如何定义脚本组件-它是源、转换还是目标组件?基于
ProcessRow(Input0Buffer data)
它闻起来像是转换/目的地顺便说一句-您在第一次尝试发布这个问题时做得很好;bool didParse=TryParse(SplitData[3]。替换(“N.A”,”),未解析);如果(didParse){GenOutputBuffer.fruit=parsed;}否则{GenOutputBuffer.Is_Null=true;}大致如此。不要将NULL放入缓冲区,而是将isnull/is_NULL的column属性设置为true