Integration Servicesでファイルチェックする方法とは?

このQ&Aのポイント
  • Integration Servicesでファイルをチェックするパッケージを作成する方法について説明します。
  • フォルダ内のファイルの存在を確認し、ファイル名、件数、カラム数をチェックする方法を解説します。
  • Integration Servicesのコントロールを使用してファイルチェックを実現する方法についても説明します。
回答を見る
  • ベストアンサー

Integration Servicesでファイルをチェックするには?

お世話になります。 また解らない事がありましたので投稿します。 昨日の今日で申し訳ありませんが宜しくお願いします。 Integration Servicesでファイルをチェックするパッケージを作成する事になりました。 下記のフォルダに取り込むファイルが格納されています。 C:\data 次に上記と同じフォルダに取り込むファイル名等の情報が記述されているファイルが格納されています。 ※ファイル名は「FileList.txt」です。 ※取り込むファイル名等の情報は下記のようにカンマ区切りで設定されています。  ファイル名,件数 ,カラム数  -----------------------------  xxxxxx.csv,12345,15      ・      ・ 「FileList.txt」を1行ずつ読み込んでフォルダ内にファイルがあるかを確認して、ファイルがなかった場合は処理を終了します。 ファイルが存在していたら、次に件数、カラム数と順に確認します。 ※件数、カラム数が異なっていた場合も処理を終了します。 どのようにすれば、いいのでしょうか? またはコントロールを使用すれば実現できますでしょうか? Google等で調べてもわかりませんでした。 申し訳ありませんがアドバイス下さい。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

その仕様をすべて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でストアド一本書いて済ましちゃうかも、サーバのセキュリティが許せばですが) とりあえず、コメントできるのはこんなところです。

edo_1972
質問者

補足

返事が遅くなって申し訳ありません。 > その仕様をすべてSSISでやる場合に、おそらくかなり厳しいところが1つあると思います。 > それは「ファイルのカラム数のチェック」です。 厳しい事を伝えたらカラム数チェックは無くなりました。 > 1)データフロータスクで、FileList.txtをADOレコードセット変数に読み込む 今日1日、上記の処理を色々と調べながら作成しましたができませんでした。リミットだけが迫って焦っています。 もう少し私にお付き合い下さい、宜しくお願いします。 「制御フロー」タブに「データフロータスク」を追加して、「データフロー」タブの中で「FileList.txt」の内容をADOレコードセット変数に読み込む処理をするのでしょうか? イメージはjamshid6さんが説明してくださったのでできたのですが・・・ この処理をIntegration Servicesで行うとなるとどのようにすればいいのか解らず手が止まってしまいます。 図々しい話ですが、もう少しご教授してくれませんでしょうか? 本当に申し訳ありませんが宜しくお願いします。

その他の回答 (2)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

「件数」ではなく「行数」です。データフロー変換の中ににありますね? 混乱しているようなので、以下の使い分けをします。 ・件数:FILELIST.txtの2カラム目に収録されているそのファイルの「件数」(説明によるとそうでしたね?) ・行数:実際にそれぞれのファイルに収録されているデータ行の数 「件数」は外側のForEachループコンテナで変数に取りだします。 「行数」の方は「行数データフロー項目」を使って取り出します。 このデータフロータスクは、それぞれの実在するファイルに対して行わなくてはいけないわけなので、内側のForEachループ コンテナの中に配置します。 データフローは「フラットファイルソース」と「行数」だけで変換先は不要です(行数が変数に受け取れればいいので) 最後にこの「件数」と「行数」を比較して一致していれば正しいファイルとして後続処理をするわけです。 #ちなみに通常設定では「この回答への補足」という欄に記載しても回答者にはメールはきません。「お礼」の欄に何か記入されたときだけメールがきます。なので、何らかレスポンスを記入したことをその回答者に気づいて欲しいケースでは補足を使わない方がいいと思います。(だからと言ってすぐ回答を書けるわけではないですけど)

edo_1972
質問者

お礼

返答が遅くなって申し訳ありません。 jamshid6さんのお陰様でファイルをチェックするパッケージを作成する事ができました。 本当にありがとうございました。 まだファイルの復号化のパッケージ作成が残っているので憂鬱ですが・・・ 頑張って作成したいと思います。 では、失礼します。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

先日の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」などと記載する これだけ書けば、何とか調べられますか。 それでもカラムチェックがなくなってよかったです。スクリプトタスクでレコードセットを読むための説明をしないといけないところでした。 (これがまた面倒なんで) まあ、頑張ってみてください。

edo_1972
質問者

補足

本当に説明していただき誠にありがとうございます。 > 質問者さんが完成させられるというところまで保証はできませんが、本当にやるのならもう少しコメントします。 難しいですが頑張りますので宜しくお願いします。 以下の処理で質問があります。 「件数」とは「ツールボックス」ので宜しいのでしょうか? >・ここは変更します。カラムチェックが不要ならば「行数」を使って行数を取得するだけでいいです。 現在、「フラットファイルソース」を使って取り込むファイルの内容を読み込み、「レコード変換先」で レコードセット変数に格納しています。 ※この方法は「1」で行った方法で処理しています。  ただし、先頭カラムのみレコードセット変数に格納しています。 「レコード変換先」から矢印がないので「件数」につなげる事ができませんでした。 「件数」の使い方がよく解りません。 色々、聞いて申し訳ありません。 自分なりに頑張りますので宜しくお願いします。

関連するQ&A

  • Integration Servicesについて

    初めて投稿させていただきます。 宜しくお願いします。 SQLServer2005の「Integration Services」を使用してFTPでファイルを取得してテーブルに格納するパッケージを作成したいと思って ネットで調べていますが、私の望むようなサイトが見つかりませんでした。 取得したファイルが暗号化されています。 調べたいのは「Integration Services」からファイルの復号化を実行する方法です。 このファイルを復号化するにはどうすればいいのでしょうか? これで調べて2日、無駄にしてしまいました。 わらをつかむ思いで投稿しました。 申し訳ありませんがご教授お願いします。 では、失礼します。

  • DOSバッチファイルで日々ファイル名が変動するファイルの存在チェック

    こんにちは。 フォルダにあるファイルが存在するときに処理を行うバッチファイルを作成しています。 あるファイル名は一部は固定文字で一部は変動します。 具体的には sampleYYMMDD.txt となり、YYMMDDは変動し、その内容は他のファイルdate.txtに入っています。 例えば、date.txtには 041021 がはいっていて バッチファイルでsample041021.txtがあれば次の処理を行うといったロジックを記述したいのですが、どうしたらできますでしょうか? ファイル名が固定であれば単純に FOR %%F DO IF %%F==sample041021.txt 処理 とできそうなのですが、ファイル名の情報はdate.txtの内容に依存します。 もっと簡単なやり方でもかまいません。ヒントをいただけないでしょうか?

  • 大量のファイルをbatファイルでフォルダ整理したい

    初めて質問させていただきます。 バッチファイルを使って、一気にフォルダの整理を行いたいと考えています。 詳しい方には簡単なことだと思いますが、そのあたりの知識に乏しく ネットで拾ったコマンドをあれこれ触ってみましたが、どうにもうまくいかず・・。 こちらで質問をさせていただく次第です。 1フォルダあたり数百~2000ファイルが保存されているフォルダが大量にあり、 それぞれのファイルのファイル名は7~8桁の番号 (連続ではない、数字は半角だが、たまに全角や半角のスペースあり)がつけられております。 これを、100ファイルずつサブフォルダに格納し、そのサブフォルダ名を 1つ目のフォルダ「1番目のファイル名-100番目のファイル名」 2つ目のフォルダ「101番目のファイル名-200番目のファイル名」 ・・・ として整理したいのです。 具体的には、 フォルダ「A」   100001.txt   ・・1番目   100005.txt     :   100500.txt   ・・100番目   100505.txt   ・・101番目     :       100705.txt   ・・200番目      ↓ フォルダ「A」   フォルダ「100001-100500」     100001.txt     100005.txt       :    フォルダ「100505-100705」     100505.txt   ・・101番目     100705.txt   ・・200番目 といった感じにしたいのです。        上位フォルダから一気に処理できれば一番よいのですが、 フォルダを1つ1つ指定してでも構いませんので、 どなたか上記の動きを実現できるbatファイルを教えていただけませんでしょうか? よろしくお願いいたします。

  • ファイル確認ツールにおいて

    使用OS:Win2000Pro あるフォルダ内のファイルのサイズと数をチェックするツールがないか探しています。なんとかフリーのツールがあればなと・・・。 組み合わせでもいいのですが、毎日のチェックに使用したいのです。 例:Aのフォルダには、A1~A10までのフォルダがあり、   その各フォルダ内のそれぞれには、数個のファイルがあります。   A1のフォルダであれば、   A101.DAT(フォルダ名+01.DAT) ~   A150.DAT(フォルダ名+50.DAT)まであります。   で、ある処理を行うとファイル名.TXTのファイルが出来ます。   A101.DATであれば、A101.TXTのように。   そこで、DATの数とTXTの数が同じかチェックが行えることと、   ファイルのサイズのチェックを行いたい。   TXTファイルは処理が正常時には、ファイルサイズが0KBで   異常時は、0KBではない。 いろいろ探してはいるのですが、なかなか見つからなくて。 よろしくお願いいたします。

  • バッチファイルでファイル名をリネームのコマンド

    お世話になります。 バッチファイルのコマンドについて質問させていただきます。 【やりたいこと】 AAA.batというバッチファイルと”MU_日付.txt”というテキストがあります。 このテキストの日付部分は毎回変わります。例)MU_111226.txt このバッチファイルとMU_日付.txtは同じ階層にあります。 まず、このAAA.batをクリックしたら、この”MU_111226.txt” を ”読み込み.txt” という名前にリネームします。このリネーム処理の時、テキスト名が”MU”で始まるファイル以外は対象にしないようにしたいのです。 次にある処理を行って、その処理が済んだら”読み込み.txt”を”END_MU_111226.txt”といった元のファイル名に”END_”を付けた形でリネームして、同じ階層にある「処理済み」フォルダへ移動させたいのです。 ”END_” + ”元のファイル名”が無理であれば、”MU_111226.txt”を「処理済み」フォルダへ移動させるだけでも構いません。 このような処理は可能でしょうか? どなたかご教授いただけますでしょうか。よろしくお願い致します。

  • readdir におけるフルパスでのファイル名取得(1)

    前提: current directory---perl scriptが存在する data directory -----.\DATA¥ current directory直下のフォルダ"DATA"に含まれるファイル名(text file)の取得は、 ------------------------------ opendir(DIR,"./DATA/"); @file=readdir(DIR); closedir(DIR); foreach $myfilename(@file){ if($myfilename=~/txt|TXT/){ print "$myfilename\n"; #確認用 } } で、できますが、フルパス付は、どのようにすればできるでしょうか? 現状、DOS promptで下記のようにやっています。 dir /s/b/o .\DATA\*.txt > filelist.dat これを、perlで読み込んで、処理をやっています。 readdirをうまく使って、perlの中で済ませてしまいたいのです。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • バッチファイルで複数のテキストファイルの置換

    バッチファイルで以下のような処理を行うことはできないでしょうか? フォルダ1以下の全てのテキストファイル内の abcde という文字列を あいうえお に置換して、上書き保存ではなく 元のファイル名+(編集済み).txt というファイル名で同じ場所に保存できないでしょうか。 バッチファイルで出来ない場合他の物でも構いません。 ――――――――――――――――――――――――――――― 処理前 フォルダ1   │   ├フォルダ2   │  └ファイル1.txt (内容:123abcde)   │   ├フォルダ3   │  └フォルダ4   │     └ファイル2.txt (内容:abcde123abcde123)   │   └フォルダ5      └ファイル3.txt (内容:456fghij) ――――――――――――――――――――――――――――― ↓ ――――――――――――――――――――――――――――― 処理後 フォルダ1   │   ├フォルダ2   │  └ファイル1.txt (内容:123abcde)   │  └ファイル1(編集済).txt (内容:123あいうえお)   │   ├フォルダ3   │  └フォルダ4   │     ├ファイル2.txt (内容:abcde123abcde123)   │     └ファイル2(編集済).txt (内容:あいうえお123あいうえお123)   │   └フォルダ5      └ファイル3.txt (内容:456fghij) ――――――――――――――――――――――――――――― こんな感じで出来ないでしょうか。 よろしくお願いします。

  • バッチファイルでファイル名をリネームのコマンドにつ

    お世話になります。 バッチファイルのコマンドについて質問させていただきます。 【やりたいこと】 AAA.batというバッチファイルと”MU_日付.txt”というテキストがあります。 このテキストの日付部分は毎回変わります。例)MU_111226.txt このバッチファイルとMU_日付.txtは同じ階層にあります。 まず、このAAA.batをクリックしたら、この”MU_111226.txt” を ”読み込み.txt” という名前にリネームします。このリネーム処理の時、テキスト名が”MU”で始まるファイル以外は対象にしないようにしたいのです。 次にある処理を行って、その処理が済んだら”読み込み.txt”を”END_MU_111226.txt”といった元のファイル名に”END_”を付けた形でリネームして、同じ階層にある「処理済み」フォルダへ移動させたいのです。 ”END_” + ”元のファイル名”が無理であれば、”MU_111226.txt”を「処理済み」フォルダへ移動させるだけでも構いません。 このような処理は可能でしょうか? どなたjかご教授いただけますでしょうか。よろしくお願い致します。

  • ファイル名の一部を変更するバッチファイル

    フォルダ内にある複数ファイルを、バッチファイルで一括ファイル名変更をしようとしています。 元ファイル名は、 23_ABCA_K.txt 23_ABCL_K.txt 23_ABCL_E.txt 23_ABCA_K.txt というように、頭2桁(日付)は共通で4ファイルあります。 これを、頭2桁を維持して、アルファベットのところを変更したいのです。 23_ABCA_K.txt→23_件数表.txt 23_ABCL_K.txt→23_集計表.txt 23_ABCL_E.txt→23_エラー数.txt 23_ABCA_K.txt→23_合否.txt という具合です。 rename 23_ABCA_K.txt 23_件数表.txt とすると、頭2桁が変化したときに対応できないし、 %date: などでシステム日付を取得すると、 23_ABCA_k.txtを24日に改名すると、23が保持されず24になってしまう・・・ 現状のファイル名の一部を取得して、改名後のファイル名につける ということはできるのでしょうか? よろしくお願いします。

  • EVAでマクロ有無チェックについて

    Excel VBAで指定したフォルダ配下のExcelファイルのマクロ有無チェックをしたいと思っています。 マクロ有無チェックまではできたのですが、パスワードを設定しているExcelファイルがあると、 そこでエラーとなってしまいます。 パスワードが設定されているExcelファイル(パスワード不明)は、フォルダパスとファイル名をSheet2に書き出し、次のファイルチェックに行くようにしたいのですが、よくわかりません。 どなたかご教授下さい。 Excel2003です。 以下まではできています。 filelist = Dir(FoldPath & "\" & "*.xls") Do While filelist <> "" Application.EnableEvents = False Set Target = Workbooks.Open(FoldPath & "\" & filelist) マクロ有無チェック    Sheet1にフォルダパス、ファイル名、マクロ有無を書き出す    Target.Close Application.EnableEvents = True filelist = Dir() Loop