- ベストアンサー
Integration Servicesでファイルチェックする方法とは?
- Integration Servicesでファイルをチェックするパッケージを作成する方法について説明します。
- フォルダ内のファイルの存在を確認し、ファイル名、件数、カラム数をチェックする方法を解説します。
- Integration Servicesのコントロールを使用してファイルチェックを実現する方法についても説明します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
その仕様をすべてSSISでやる場合に、おそらくかなり厳しいところが1つあると思います。 それは「ファイルのカラム数のチェック」です。 SSISはファイルを読み込むときに、テキストファイルの接続マネージャで、取り込むファイルの列を定義します。 従って、何カラムあるかわからないファイルを読み込むというアプローチ自体が取れないと思います。 (考えてみればカラム数が違うファイルなら、後続の処理も分けないといけないですけどね) ファイルチェックというのに特化して考えた場合でも、「固定長で読み込んでデリミタの数を数える」という方法しか浮かびませんでした。 上記を踏まえて構成ですが、「ForEachループコンテナ」の入れ子構造になると思います。 イメージとしては、 1)データフロータスクで、FileList.txtをADOレコードセット変数に読み込む 2)ForEachループコンテナ(ForEach ADO列挙子) ・ここでファイル名、件数、カラム数を変数に読み込む 2-1)入れ子のForEachループコンテナ(ForEach File列挙子) ・2)で読み込んできたファイル決め打ちのループ(あれば1回、なければ0回) 2-1-1)データフロータスクで、ファイルを固定長ファイルとしてADOレコードセット変数に読み込む 2-1-2)スクリプトタスクでレコードセットの件数と、1行あたりのカラム数を数え、それぞれ変数にセット 2-1-3)後続処理。前の処理との間に件数一致、カラム数一致の制約をつける できなくはないですが、もしSSISの作成経験があまりなければ、かなりの茨の道かもしれません。 (私ならBULK INSERTとOPENROWSETでストアド一本書いて済ましちゃうかも、サーバのセキュリティが許せばですが) とりあえず、コメントできるのはこんなところです。
その他の回答 (2)
- jamshid6
- ベストアンサー率88% (591/669)
「件数」ではなく「行数」です。データフロー変換の中ににありますね? 混乱しているようなので、以下の使い分けをします。 ・件数:FILELIST.txtの2カラム目に収録されているそのファイルの「件数」(説明によるとそうでしたね?) ・行数:実際にそれぞれのファイルに収録されているデータ行の数 「件数」は外側のForEachループコンテナで変数に取りだします。 「行数」の方は「行数データフロー項目」を使って取り出します。 このデータフロータスクは、それぞれの実在するファイルに対して行わなくてはいけないわけなので、内側のForEachループ コンテナの中に配置します。 データフローは「フラットファイルソース」と「行数」だけで変換先は不要です(行数が変数に受け取れればいいので) 最後にこの「件数」と「行数」を比較して一致していれば正しいファイルとして後続処理をするわけです。 #ちなみに通常設定では「この回答への補足」という欄に記載しても回答者にはメールはきません。「お礼」の欄に何か記入されたときだけメールがきます。なので、何らかレスポンスを記入したことをその回答者に気づいて欲しいケースでは補足を使わない方がいいと思います。(だからと言ってすぐ回答を書けるわけではないですけど)
お礼
返答が遅くなって申し訳ありません。 jamshid6さんのお陰様でファイルをチェックするパッケージを作成する事ができました。 本当にありがとうございました。 まだファイルの復号化のパッケージ作成が残っているので憂鬱ですが・・・ 頑張って作成したいと思います。 では、失礼します。
- jamshid6
- ベストアンサー率88% (591/669)
先日のPGPタスクといい、限られた時間でまたずいぶん厳しい作業を受けるものですね。 質問者さんが完成させられるというところまで保証はできませんが、本当にやるのならもう少しコメントします。 >1)データフロータスクで、FileList.txtをADOレコードセット変数に読み込む ・変換元は「フラットファイルソース」、変換先は「レコードセット変換先」です。 ・事前にPackageスコープでObject型の変数を1つ定義し、それを変換先に指定します。 ・ファイルの内容がADO.NETのレコードセットとしてその変数に入ります。 >2)ForEachループコンテナ(ForEach ADO列挙子) ・「すべてのテーブルの行」を選択し、変数のマッピングはファイルのレイアウトの分だけString型の変数をインデックス0から順に割り当てます(カラム数がなくなれば2項目だけ?) >2-1)入れ子のForEachループコンテナ(ForEach File列挙子) ・パスは固定でよいですが、ファイル名は変数を使うので、Expressionを使います。FileSpecに上記でファイル名のカラム内容を受け取った変数を指定します。 ・取得は完全修飾名を選び、フルパスのファイル名を収録するString型の変数を定義してマッピングします。 ・これでファイル名決め打ちのループになるのであれば1回だけ実行するループになります。 >2-1-1)データフロータスクで、ファイルを固定長ファイルとしてADOレコードセット変数に読み込む ・ここは変更します。カラムチェックが不要ならば「行数」を使って行数を取得するだけでいいです。 ・ファイル名は2-1)で取得したフルパス名を使うので、接続マネージャのプロパティからまたExpressionを使います。ConnectionStringに変数を割り当てます。 >2-1-2)スクリプトタスクでレコードセットの件数と、1行あたりのカラム数を数え、それぞれ変数にセット ・ここもカラムチェックが不要ならば本当は不要になるところですが、経験上、ファイルから読み込んだレコードセットを整数型の変数にダイレクトに読み込めないと思います。 だから2)でString型の変数に入れたのですが、一方行数は整数型です。 これを次の制約で使うためには型を合わせなくてはならず、ファイルから読み込んだ「件数」を整数型にするための処理を記述します。 (もっともシンプルなスクリプトタスクです) >2-1-3)後続処理。前の処理との間に件数一致、カラム数一致の制約をつける ・制約は「評価と制約」を使い、条件に「@ROWCNT==@FILEDATACNT」などと記載する これだけ書けば、何とか調べられますか。 それでもカラムチェックがなくなってよかったです。スクリプトタスクでレコードセットを読むための説明をしないといけないところでした。 (これがまた面倒なんで) まあ、頑張ってみてください。
補足
本当に説明していただき誠にありがとうございます。 > 質問者さんが完成させられるというところまで保証はできませんが、本当にやるのならもう少しコメントします。 難しいですが頑張りますので宜しくお願いします。 以下の処理で質問があります。 「件数」とは「ツールボックス」ので宜しいのでしょうか? >・ここは変更します。カラムチェックが不要ならば「行数」を使って行数を取得するだけでいいです。 現在、「フラットファイルソース」を使って取り込むファイルの内容を読み込み、「レコード変換先」で レコードセット変数に格納しています。 ※この方法は「1」で行った方法で処理しています。 ただし、先頭カラムのみレコードセット変数に格納しています。 「レコード変換先」から矢印がないので「件数」につなげる事ができませんでした。 「件数」の使い方がよく解りません。 色々、聞いて申し訳ありません。 自分なりに頑張りますので宜しくお願いします。
補足
返事が遅くなって申し訳ありません。 > その仕様をすべてSSISでやる場合に、おそらくかなり厳しいところが1つあると思います。 > それは「ファイルのカラム数のチェック」です。 厳しい事を伝えたらカラム数チェックは無くなりました。 > 1)データフロータスクで、FileList.txtをADOレコードセット変数に読み込む 今日1日、上記の処理を色々と調べながら作成しましたができませんでした。リミットだけが迫って焦っています。 もう少し私にお付き合い下さい、宜しくお願いします。 「制御フロー」タブに「データフロータスク」を追加して、「データフロー」タブの中で「FileList.txt」の内容をADOレコードセット変数に読み込む処理をするのでしょうか? イメージはjamshid6さんが説明してくださったのでできたのですが・・・ この処理をIntegration Servicesで行うとなるとどのようにすればいいのか解らず手が止まってしまいます。 図々しい話ですが、もう少しご教授してくれませんでしょうか? 本当に申し訳ありませんが宜しくお願いします。