0

我无法理解如何从该文件中提取数据:

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 文件。我个人知道这是一种糟糕的做法。

4

1 回答 1

1

这就是我们处理此类问题的方式:通常,您必须将流程分成几个部分:

  1. 拆分 csv 文件。
  2. 读取不同的文件类型。

广告 1. 放一个Data Flow来读取输入的 csv 文件。

  • Flat File Source从字符串类型的一列 ( Column1)开始。我们这样做只是为了获得您提到的行类型。

  • 用于Transformation Component将这条线分成几块。获取第一个值(您的类型标识符)并将其设置为名为 OutputBuffer ( ResultBuffer) 的列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. 创建一个Data Flow包含 5 个单独的容器以分别从每个创建的文件中读取,并正确设置列名和类型。

于 2013-09-14T17:56:31.040 回答