2017-08-16 14 views
0

出力レコードごとに2種類の入力レコードを持つ入力フラットファイルがあります。最初のレコード(最初の列のCで示される)にはIDと人口統計情報があります。 2番目のレコード(最初の列のLで示される)には、財務情報がいくつかあります。それらは、区切られたパイプであり、異なる長さのパイプです。データフローのスクリプトコンポーネントのSSIS設定変数

すべてのCレコードを1つのストリームに書き込む方法はありません。また、Lレコードを別のストリームに書き込んだり、再び一緒に戻したりする方法はありません。ですから、私の解決策は条件付き分割を行うことです。私がSSIS変数に必要なすべての情報をCレコードストアに書き込むと、私がLレコードをヒットすると、変数から派生カラムを作り出し、派生カラムとLレコードのカラムを使用して、出力レコード(フラットファイル)を作成します。

私はインターネット上を見渡してきましたが、スクリプトコンポーネント内でCレコードのパスの変数を設定するC#コードを見つけることができません。私は、コードは次のようになりたいのは(入力ファイルから)

Variable.Userのようなもの::ファーストネーム=カラム2(入力ファイルから) Variable.User ::姓を=列3である

など

誰かが私を助けることができますか?

おかげで、

ディック

答えて

1

このアイデアは動作しません。各行が処理されるときに、変数を使って何ができると思いますか?スクリプトを終了するときに変数が次の行の値によって設定されているため、変数の値を使って行うことは、変数に値を設定するスクリプトで行わなければなりません。

しかし、学術としてのあなたの質問を処理し、スクリプトコンポーネント内の変数にアクセスする方法は、既に求められており、ここで答え:How to access ssis package variables inside script component

をここに私はこれにアプローチする方法を次のとおりです。

  1. は、あなたの設定各行が単一の列になるようにします。
  2. 次に、C行を1つのパスに、L行を別のパスに送る条件付き分割を実行します。
  3. 各パスで、派生列文字列を実際の区切り文字で分割し、そのパスのレコードタイプの実際の列を作成するスクリプト変換または変換を使用します。
  4. 別の宛先に到達するまで、残りの処理を続けます。
0

私は、スクリプトコンポーネントを使用して好き:

ファーストステップは、データフローを追加することです。データで

は、スクリプトコンポーネントを追加して流れ、入力/出力のソース

を選択しました: 出力としてあなたが望むあなたの列の情報を追加します。 (多くの列を持つ2つの別々の出力があることに注意してください)、データタイプを選択してください。

スクリプトエディタを入力します。ここ

文が

string strPath = ""; 
    var lines = System.IO.File.ReadAllLines(strPath); 

foreach (string line in lines) 
{ 
    if (line.Substring(1, 1) == "C") 
    { 
     char[] delim = "|".ToCharArray() ; 
     var C_cols = line.Split(delim); 
     Output0Buffer.AddRow(); 
     Output0Buffer.FirstName = C_cols[0]; 
     Output0Buffer.LastName = int.Parse(C_cols[1]); //Note that everything is a string until cast to correct data type 
     // Keep on going 
    } 

    if (line.Substring(1, 1) == "L") 
    { 
     char[] delim = "|".ToCharArray(); 
     var L_cols = line.Split(delim); 
     Output2Buffer.AddRow(); 
     Output2Buffer.FirstName = L_cols[0]; 
     Output2Buffer.LastName = int.Parse(L_cols[1]); 
     // Keep on going 
    } 
} 

この時点で、スクリプトコンポーネントは、異なる経路をダウン導くことができる2つの出力を有することになる場合、別個2を使用するコードです。

0

ご回答ありがとうございます。

私はCレコードとその後のLレコードの両方が必要なので、入力ファイル全体をSQL Serverテーブルにロードすることにしました。 SQLに入ったら、テーブルのレコードをカーソルで移動するためのかなり簡単なストアドプロシージャを作成し、Cレコードの場合は必要な列をSQL変数に入れ、SQL変数と入力データのデータを出力レコードに挿入しますそれがLレコードだったとき(私はSSIS内で全力を尽くそうとしていたのと同じことだが、できなかった)。出力レコードのテーブルにデータが入力された後は、データフローを作成して、テーブル出力レコードのすべてのレコードをデータフローソースとして選択し、それらをデータソースデスティネーションとして必要なフラットファイルに配置するだけでした。

ディックローゼンバーグ

関連する問題