我无法理解如何从此文件中提取数据:
0|V1102299|USA05639|A&P POLYCHEM|20110214|49896.0000 |0.0000
1|V1102299|00001|USA05639|A&P POLYCHEM|20110222|DOA100||Di Octyl Adipate 210KG/DR|16800.000 |KG|2970.0000
2|V1102299|00001|00|20130617|5000010209||16800.000 ||49896.0000
4|USA05639|A&P POLYCHEM|FRB1|Freight (Value)|4100.000000000 |USD
4|USA05639|A&P POLYCHEM|ZL02|Fuel (value)|0.000000000 |USD
4|USA05639|A&P POLYCHEM|ZL01|Temp Control (value)|0.000000000 |USD
4|USA05639|A&P POLYCHEM|ZOB1|Customs (Value)|0.000000000 |USD
4|USA05639|A&P POLYCHEM|ZL03|Haz. Mat. (value)|0.000000000 |USD
其中第一列表示行类型:
0
是根元素(必填) 1
是儿童(可选,多个) 2
是儿童(可选,多个) 3
是儿童(可选,多个) 4
是儿童(可选,多个) 并提取到具有相应行列的多个表,并保持行之间的关系 每行都有自己的列数和列名,类型。
注意:我对如何收到此csv文件无法控制。我个人知道这是一种可怕的做法。
答案 0 :(得分:1)
这就是我们应对这些问题的方法:一般来说,你必须将这个过程分成几个部分:
广告1.添加Data Flow
以阅读输入csv文件。
从Flat File Source
开始,只作为字符串类型的一列(Column1
)。我们这样做只是为了得到你提到的行类型。
使用Transformation Component
将此行拆分为多个部分。获取第一个值(您的类型标识符)并将其设置为名为ResultBuffer
的OutputBuffer(TypeID
)列:
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
var arr = Row.Column1.Split('|'); // Splitting the rows of Names column
ResultBuffer.AddRow();
ResultBuffer.TypeID = arr[0];
}
Conditional Split
检查类型:
TypeID == 0
(与其他人相似)。在此之后,只需要正常的Flat File Destination
,即可将您已阅读的一列保存到文件名TypeID_file.txt
。广告2。
使用5个单独的容器创建一个Data Flow
,分别从每个创建的文件中读取,并正确设置列名和类型。