4

我有一个文件源,其中数据如下所示:

ID BarcodeNumber
------------------------
1  123456789    
1  33    
2  987654321    
2  44

我想得到如下数据:

ID BarcodeNumber
------------------------
1  12345678933    
2  98765432144

关于如何做到这一点的任何建议?

编辑:我想在数据流中执行此操作,因为这可能有数十亿行。

4

2 回答 2

6

期望的状态是,对于每个 ID,所有条形码都将连接在一起。

为此,您的数据必须按 ID 排序。如果文件尚未排序,则需要通过排序任务运行它。

对数据进行排序后,您需要在异步模式下添加脚本转换。它将是异步的,因为输入的行数与输出的行数不同。

伪代码将类似于

If Row.ID <> LastID
    If LastID <> ""
        Output0Buffer.ID = LastID
        Output0Buffer.Barcodes = Barcodes
    LastID = Row.ID
    Barcodes = ""

Barcodes = Barcodes + Row.Barcodes

注意事项

  • 上面的代码既不是 C# 也不是 VB.NET 但逻辑应该是合理的
  • 如果您有数十亿行,那么您将需要在这台机器上使用一些重要的 RAM,因为 SSIS 是一个内存转换系统。
  • 排序操作和此脚本任务将很慢且内存密集,因为它们无法重用内存空间
于 2013-06-14T18:25:03.490 回答
4

数据流

源文件:

ID,RowNum,Barcode   
1,1,123456789  
1,2,33    
2,1,987654321    
2,2,44

拆分文件的行。对于这里源文件中假设的简单情况,我们可以使用条件拆分。对于更多涉及的情况,我们可以使用 Script 组件作为拆分器。从这里开始,解决方案将是非常标准的 wrt 排序和合并。合并后,添加一个派生列:TRIM(Barcode1) + TRIM(Barcode2) 其中 Barcode1 来自“左侧”,其中行数为 1,而 Barcode2 来自“右侧”。如果您关心排序组件的性能,请将拆分的行放在两个表中,然后比较性能。

Cond. Split: RowNum1 (RowNum == "1"), RowNum2 (RowNum == "2")
Sort: By ID; Pass through: Barcode
Merge Join: Left outer join, Join key: ID; Output: ID, Barcode1 and Barcode2
Derived column: TRIM(Barcode1) + TRIM(Barcode2)
于 2013-06-17T00:33:20.347 回答