2

データベースにロードするファイルのリストを含むテキスト ファイルがあります。

リストには次の 2 つの列が含まれます。

FilePath,Type
c:\f1.txt,A
c:\f2.txt,B
c:\f3.txt,B

このファイルを SSIS のソースとして提供したいと考えています。次に、1行ずつ通過させたいと思います。行ごとに、FilePath 列のファイルを読み取り、Type を確認するようにします。

タイプが A の場合、現在の行の FilePath 列にあるファイルの最初の 4 行を無視し、そのファイル内の残りのデータをテーブルにロードします。タイプが B の場合、ファイルを開き、ファイルの最初の列をテーブル 1 に、2 番目の列をすべての行のテーブル 2 にコピーします。

誰かが私が従う必要がある手順の高レベルのリストを提供してくれれば、本当に感謝しています.

どんな助けでも大歓迎です。

4

3 に答える 3

4

SSIS 内でこれを行う 1 つの方法を次に示します。以下の手順はSSIS 2008 R2に関するものです。

  • SSIS パッケージを作成し、3 つのパッケージ変数 ( FileNameFilesToReadおよび) を作成しますType。FilesToRead 変数は、ファイルのリストとそのタイプ情報を保持します。これらの各レコードを通過し、ループするたびにFileName変数とType変数に情報を格納するループがあります。

変数

  • [制御フロー] タブで、データ フロー タスクを配置し、その後に ForEach ループ コンテナーを配置します。データ フロー タスクは、処理する必要があるファイルのリストを含むファイルを読み取ります。その後、ループは各ファイルを通過します。制御フロー タブは、最終的に次のようになります。今のところ、何も構成されていないため、エラーが発生します。それについては後ほど説明します。

制御フロー

  • 接続マネージャー セクションでは、4 つの接続が必要です。
  • まず、データベースに接続するための OLE DB 接続が必要です。これを と名付けSQLServerます。
  • 2 つ目は、ファイルと種類のリストを含むファイルを読み取るためのフラット ファイル接続マネージャーです。このフラット ファイル接続マネージャーには、構成された 2 つの列、つまり Name this as が含まFileNameTypeますFiles
  • 3 番目に、タイプ A のすべてのファイルを読み取る別のフラット ファイル接続マネージャーですType_A。このフラット ファイル接続マネージャーで、テキスト ボックスに値 4 を入力しHeader rows to skipて、最初の 4 行が常にスキップされるようにします。
  • 4 番目に、タイプ B のすべてのファイルを読み取るためのもう 1 つのフラット ファイル接続マネージャーですType_B

接続

  • 制御フローに戻りましょう。最初のデータ フロー タスクをダブルクリックします。データ フロー タスク内に、接続マネージャーを使用してすべてのファイルを読み取るフラット ファイル ソースをFiles配置し、Recordset Destination. FilesToReadレコードセットの宛先で変数を構成します。最初のデータ フロー タスクは次のようになります。

データ フロー タスク

  • では、再び制御フロータブに戻りましょう。以下に示すように、ForEach ループを構成します。このループは、変数に格納されているレコードセットを通過しますFilesToRead。レコードセットには 2 つの列が含まれているため、レコードがループされるたびに、変数FileNameType現在のレコードの値が割り当てられます。

コレクションごとに

変数ごとに

  • for each ループ コンテナー内には、 と という 2 つのデータ フロー タスクがType A filesありType B filesます。これらのデータ フロー タスクのそれぞれを要件に従って構成し、接続マネージャーからファイルを読み取ることができます。ただし、読み取られているファイルに基づいてタスクを無効にする必要があります。
  • Type A filesデータ フロー タスクは、A タイプのファイルが処理されている場合にのみ有効にする必要があります。
  • 同様に、Type B filesデータ フロー タスクは、B タイプのファイルが処理されている場合にのみ有効にする必要があります。
  • これを実現するには、Type A filesデータ フロー タスクをクリックし、F4 キーを押してプロパティを表示します。プロパティで使用可能な省略記号ボタンをクリックしExpressionます。
  • プロパティ式エディターで、[Disableプロパティ] を選択し、式を入力します。!(@[User::Type] == "A")

式A

  • 同様に、Type B filesデータ フロー タスクをクリックし、F4 キーを押してプロパティを表示します。プロパティで使用可能な省略記号ボタンをクリックしExpressionます。
  • プロパティ式エディターで、[Disableプロパティ] を選択し、式を入力します。!(@[User::Type] == "B")

式 B

  • リストに A タイプのファイルのみを含むサンプル Files.txt を次に示します。パッケージを実行してこのファイルを読み取ると、Type A filesデータ フロー タスクのみが実行されることがわかります。

サンプルファイル a

サンプル実行

  • リストに B タイプのファイルのみを含む別のサンプル Files.txt を次に示します。パッケージを実行してこのファイルを読み取ると、Type B filesデータ フロー タスクのみが実行されることがわかります。

サンプルファイル b

サンプル実行 b

  • Files.txt に A と B の両方のタイプのファイルが含まれている場合、ループは、処理中のファイルのタイプに基づいて適切なデータ フロー タスクを実行します。

データ フロー タスク タイプ A ファイルの構成

  • タイプ A のフラット ファイルに、以下に示すように値がコンマで区切られた 3 つの列のレイアウトがあるとします。ここでのファイル データは、すべての特殊文字を含む Notepad++ を使用して表示されます。CR LF行がキャリッジ リターンとライン フィードで終了していることを示します。このファイルはパス C:\f1.txt に保存されます。

ファイルを入力

  • データをインポートするには、データベースにテーブルが必要です。dbo.Table_Aここに示すように、SQL Server データベースでという名前のテーブルを作成しましょう。

テーブル

  • 次に、SSIS パッケージに移動します。Type_Aという名前のフラット ファイル接続マネージャーを構成するための詳細を次に示します。接続マネージャーに名前を付けます。テキストボックスをスキップするには、ヘッダー行に値 4 を指定する必要があります。フラット ファイル接続マネージャーは次のようになります。

フラットファイル全般

フラットファイル列

  • [詳細設定] タブで、必要に応じて列名を変更できます。

フラットファイルアドバンスト

  • Type A files接続マネージャーが構成されたので、対応するファイルを処理するようにデータ フロー タスクを構成する必要があります。データ フロー タスクをダブルクリックしますType A files。タスク内にフラット ファイル ソースと OLE DB 変換先を配置します。

データ フロー タスク

  • フラット ファイル ソースは、フラット ファイル接続マネージャーからファイルを読み取るように構成する必要があります。

フラットファイルソース接続

フラット ファイル ソース列

  • データ フロー タスクは特別なことは何もしません。タイプ A のフラット ファイルを読み取り、データをテーブル dbo.Table_A に挿入するだけです。ここで、データをデータベースに挿入するように OLE DB Destination を構成する必要があります。フラット ファイル接続マネージャーとテーブルで構成されている列名が同じではありません。そのため、手動でマッピングする必要があります。

ole db 宛先接続

ole db 宛先列

  • これで、データ フロー タスクが構成されました。Files.txt から読み取られるファイル パスが正しく渡されるようにする必要があります。これを行うには、Type_A フラット ファイル接続マネージャーをクリックし、F4 キーを押してプロパティを表示します。DelayValidationプロパティを に設定しますTrueEllipsisプロパティのボタンをクリックしExpressionsます。

プロパティ

  • Property Expression Builder で、ConnectionStringプロパティを選択し、式に設定します。@[User::FileName]

表現

  • タイプ A ファイルのみを含むサンプル Files.txt ファイルを次に示します。

ファイル

  • サンプルのタイプ A ファイル f01.txt および f02.txt を次に示します。

f01

f02

  • パッケージの実行後、テーブル Table_A に次のデータが見つかります。

テーブルデータ

  • タイプ B ファイルについては、上記の構成手順に従う必要があります。ただし、ファイル処理ロジックが異なるため、データ フロー タスクは若干異なります。データ フロー タスクのタイプ B ファイルは、次のようになります。タイプ B ファイルの 2 つの列を異なるテーブルに挿入する必要があるためです。入力データのクローンを作成するマルチキャスト変換を使用する必要があります。各マルチキャスト出力を使用して、異なる変換または宛先にパススルーできます。

データ フロー タスク タイプ b

あなたの仕事を達成するのに役立つことを願っています。

于 2012-04-26T02:59:54.587 に答える
1

実行するファイルの読み込みの種類ごとにSSISパッケージを作成することをお勧めします。これらのパッケージは別のプログラムから実行できます。ここを参照してください:.NETからSSISパッケージを実行する方法は?

この情報があれば、関連するパッケージを実行するための簡単なプログラムを作成できます。

var jobs = File.ReadLines("C:\\temp\\order.txt")
               .Skip(1)
               .Select(line => line.Split(','))
               .Select(tokens => new { File = tokens[0], Category = tokens[1] });

foreach (var job in jobs)
{
    // execute the relevant package for job.Category using job.File
}
于 2012-04-26T01:15:04.360 に答える
1

私のソリューションは、ソース ファイルを処理するための N + 1 個のフラット ファイル接続マネージャーのように見えます。CM A は最初の 4 行をスキップするファイル形式に対応し、B は 2 列のファイルのように聞こえます。最後の CM は、説明したコマンド ファイルを解析するために使用されます。

これらの接続マネージャーをすべて定義したので、処理ロジックに取り掛かることができます。

3 つの変数を作成します。文字列型の 2 (CurrentPath、CurrentType)。1 は Object 型で、これを Recordset と呼びます。

ここに画像の説明を入力

最初のデータ フローは、「CM コントロール」を使用してフラット ファイル ソースからすべての行を読み取ります。これは、例で提供したデータです。

次に、その Recordset オブジェクトを、一般にシュレッディングと呼ばれる ForEach ループ コンテナーのソースとして使用します。「Shred recordset ssis」という言葉を思い浮かべると、その方法を説明する記事がたくさん出てくるはずです。最終的な結果として、そのソース CM 制御ファイルの各行に対して、それらの値を CurrentPath および CurrentType 変数に割り当てます。

そのループ コンテナ内に、制御が放射状に広がるように、制御の中心点を作成します。これにはスクリプト タスクが最適です。それをキャンバスにドラッグし、何にも使用されないことを示す厳密な名前を付けてから、各処理順列を処理するデータ フローを作成します。

魔法は式を使用することから生まれます。SSIS のほぼすべての Dang は、そのプロパティに式を設定できます。これが、プロとポーザーを区別するものです。ここで、特定のデータ フローに接続している線をダブルクリックし、制約の種類を [制約] から [式と制約] に変更します。次に使用する式は次のようなものです@[User::CurrentType] == "A"。親タスクが成功し、条件が真です。

式マジックの 2 番目のビットは、接続マネージャー自体に適用されます。プロパティの値によって駆動される ConnectionString プロパティが必要@[User::CurrentFile]です。これにより、設計時の値C:\filea.txtは許可されますが、制御ファイルからの実行時の値は次のようになります。\\network\share\ClientFileA.txtすべてのファイルが同じ構造でない限り、プロパティで DelayValidation を True に設定する必要があります。そうしないと、SSIS は PreValidation に失敗します。これは、"CM A" から "CM N" までのすべてが、そのファイル レイアウトの有効な接続文字列である場合とそうでない場合がある CurrentFile 変数を使用するためです。

于 2012-04-26T02:28:22.293 に答える