4

データが次のようなファイル ソースがあります。

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

次のようにデータを取得したいと思います。

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

これを達成する方法について何か提案はありますか?

編集:これは数十億行になる可能性があるため、データフローでこれを行いたいと思います。

4

2 に答える 2

6

望ましい状態は、ID ごとにすべてのバーコードが連結されることです。

これを実現するには、データを ID でソートする必要があります。ファイルがまだソートされていない場合は、Sort タスクを実行する必要があります。

データを並べ替えたら、非同期モードでスクリプト変換を追加する必要があります。行の数は行の数と同じではないため、非同期になります。

疑似コードは次のようになります

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

Barcodes = Barcodes + Row.Barcodes

注意事項

  • 上記のコードは C# でも VB.NET でもありませんが、ロジックは適切である必要があります
  • 何十億もの行がある場合、SSIS はメモリ内変換システムであるため、このマシンにかなりの RAM が必要になります。
  • 並べ替え操作とこのスクリプト タスクは、メモリ領域を再利用できないため、遅くなり、メモリを大量に消費します。
于 2013-06-14T18:25:03.490 に答える
4

データフロー

ソースファイル:

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

ファイルの行を分割します。ここのソース ファイルで想定されている単純なケースでは、条件付き分割を使用できます。より複雑な状況では、スクリプト コンポーネントをスプリッターとして使用できます。ここから先は、ソリューションはかなり標準的なソートとマージになります。マージしたら、派生列を追加します: TRIM(Barcode1) + TRIM(Barcode2) こ​​こで、Barcode1 は RowNum 1 の行を持つ「左側」から来ており、Barcode2 は「右側」から来ています。並べ替えコンポーネントのパフォーマンスが気になる場合は、分割された行を 2 つのテーブルに入れ、パフォーマンスを比較します。

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 に答える