2016-03-24 13 views
0

1行に1レコードという構文のフラットファイルを処理する必要があります。SSIS - さまざまなデータを含むフラットファイルを処理する

<header>|<datagroup_1>|...|<datagroup_n>|[CR][LF] 

ヘッダーには決して変更されない固定長フィールド形式(ID、タイムスタンプなど)があります。ただし、データ・グループにはさまざまなタイプがあり、固定長であってもそのフィールドの数はデータ・グループのタイプによって異なります。データグループの最初の3つの数字はそのタイプを定義します。各レコードのデータグループの数も変化します。

私の考えは、すべてのデータグループを挿入するステージングテーブルを持つことです。したがって、このような2つのレコード

12320160101|12323456KKSD3467|456SSGFED43520160101173802| 
98720160102|456GGLWSD45960160108854802| 

ステージングテーブルには3つのレコードが生成されます。

ID Timestamp Data 
123 01/01/2016 12323456KKSD3467 
123 01/01/2016 456SSGFED43520160101173802 
987 02/01/2016 456GGLWSD45960160108854802 

これは、(いくつかは、いくつかは、彼らのデータをさらに細分している、廃棄される)、さらに処理するための前処理段階的な記録を私にできるようになります。私の質問は、ステージングテーブルにフラットファイルを分解する方法です。レコード全体をパイプ(|)で分割し、派生列変換を使用してヘッダーをSUBSTRINGで分割することができます。その後、データグループの数が変化するため、処理が煩雑になります。

答えて

0

私が思いついた解決策は、フラットファイルソースで分割するのではなく、スクリプトで分割しようとしました。私のデータフローは次のようになります。

enter image description here

ので、フラットファイルソースの出力は、行全体を含む1つだけの列です。スクリプトコンポーネントには、ステージングテーブルの各列の出力列が含まれています。スクリプトは次のようになります。

public override void Input0_ProcessInputRow(Input0Buffer Row) 
{ 
    var splits = Row.Line.Split('|'); 

    for (int i = 1; i < splits.Length; i++) 
    { 
     Output0Buffer.AddRow(); 
     Output0Buffer.ID = splits[0].Substring(0, 11); 
     Output0Buffer.Time = DateTime.ParseExact(splits[0].Substring(14, 14), "yyyyMMddHHmmssFFF", CultureInfo.InvariantCulture); 
     Output0Buffer.Datagroup = splits[i]; 
    } 
} 

SynchronousInputIDプロパティ(スクリプト変換エディタ>入力と出力> Output0)をNoneに設定する必要があります。それ以外の場合は、あなたのスクリプトでOutput0Bufferを利用することはできません。最後に、OLE DB Destinationは、スクリプト出力列をステージング表の列にマップするだけです。これは、1つの入力レコードから複数の出力レコードを作成する際の問題を解決します。

関連する問題