• 締切済み

VBSを使用し、テキストファイルをキー項目で分割コピーしたいです

お世話になります。 VBSにて、テキストファイル(=全社データ.csv)をキー項目(=[部署名])で分割コピーし、 各々別フォルダに保存したいと思っています。 全社データ.csvのデータ量が莫大なので、より高速な手段をとりたいと思っているのと、 VBS初心者のため一般的にはどういう方法が王道なのかがわからないため アドバイスをいただければと思い投稿させていただきました。  【現在漠然と考えている手法1】   ADOでテキストファイルを読み込みSQLで分割する方法。   (部署名は変数で渡し、部署分ループしファイルを作成)   Set RS = objADO.Execute("select * from 全社.csv where 部署名='営業部'")という感じを考えています。  【現在漠然と考えている手法2】   テキストファイルを部署名でソートし、上から順次1行ずつ読み込み部署名を判定し、分割コピーする方法。 想像すると手法1のほうが全然高速そうなのですが、一般的な方法はどんな感じなのでしょうか? たいぶ能力的におぼつかないので、 両方の方法を調べてプログラムを作成しテストしてみるとなると相当時間がかかってしまいそうなので、 方向性を教えていただけると大変助かります。 漠然とした手法でかまいませんので、お時間があれば是非アドバイスよろしくお願いします。

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

#1です。補足的なことを書いていただいて、ありがとうございました。対象データ540万を聞いて 私の表現が、意図を正しく伝わらない点があることを心配して書き足します。 >1ヶ月分のファイル(レコード数15万件)×3年(36ヶ月)=540万件 なので、 この作業はこれ1回きりですか。3年分とは悠長な話ですが、 なぜ月次、各期次で小刻みに作業しないのでしょう。この仕事の全体像が良く見えません。 なんとなく、質問者はこういうのははじめてのような感じがするが、システム設計に無理は無いでしょうね。 ーー >3年分を結合したものを部署別に分割しようかと思っていましたが、 インプットファイルを1レコードずつ読んで、(これはプロブララム上の論理的な話です。OSのファイルシステムがどう処理しているかは別)CSVファイルはそれまでの(アウトプットファイルの)後に(アペンドモード)追加していけばよい。かかる時間は)1レコード読み時間+1レコード書く時間)xインプトファイルレコード数。入出力バッファーエリアなどがあるので、この通りではないが、ほぼレコード数に比例するということ。 >3年分を結合したものを部署別に分割しようかと思っていましたが、 部署別に分割したファイルを3年分結合するしかなさそうなんですね。 それはそうとも言えない。部署ごとに独立したファイルが沢山増えるとマージ(併合)も大変な作業です。 2年分を結合するにも、普通は業務ではツールを作って(購入してあって)それに基づいてやらないと、ファイルの併合漏れが起こったりする。 >OFFICEアプリケーションに依存しない(=直接メモリで展開)ので、PC本体の性能だけの問題なのかなぁ。。。という理解でした。 質問のところのカテは、エクセル・アクセルの範疇かと思っていました。私の回答もそういう面でピンとはずれかも知れない。 Oracle以上のデータベースDB2などの本式ソフトが望ましいのかもしれない。 この辺経験者では無いので、正確ではない。 >ファイルに検索などに便利な構造を持ち込まなければ、単純シーケンシャルファイルなら、おっしゃるとおりでしょう。 メモリに溜め込んでユーザー独自の入出力処理をするとなると プログラム作成に気をつけないと誤りが入り込む。 >WHSで実行するVBSは、 単純にインプットファイルを次ぎ足していくなら、ディスクの容量が許せば走る理屈です。メモリにやたらに溜め込みはしないでしょうから。しかし数が多くなると、また今後も起こる、繰り返し作業だと、作業用ツールみたいなものが無いと、作業結果が不安です(例えばインプットファイル名一覧。同じファイルをダブって併合したなど。)。 >ソートプログラムのの自作は余りお勧めできません と私が書いたのは、教科書などソートのアルゴリズムは載っていて フムフムと判るが、内部のメモリの配列の限度までが制約であることは注意されていません。一部分の数のソート済みレコードをディスクに一時書き出し、最後に「連」が1本化するロジックなど、ソフト会社など定式を知っている人以外の、なれない人素人ロジックでプログラムを組むと、エラー含みになり、結果の影響が大きい。 >1レコード読んで1レコードを書く繰り返しが と書いたのは、ファイルが1本化した後は1レコードを読んで 部署ごとのファイルに1レコードを書き出せばよい、という意味で書いた。質問者の受け取り方と違うような。 >毎朝バッチファイル経由でこのプログラムを自動実行しようと思っており、実行するサーバーには現在 ここを読むと、質問は日次作業であり、ある程度、業務の根幹に位置する作業のようです。質問者の立場・技量が明かされないので、誤解しているかもしれませんが、こういうのはプロに任せる内容の気がします。 >Csvとソート ソートキーは先頭から定位置桁から始まる必要があります。 CSVファイルは、定位置に項目を置く主義のファイル形式で無いので 、ソートに入る前に、もう1段レコード編集が必要な場合があります ーー 大型建設作業では、同じ自動車とはいえ、軽トラではなく大型ダンプがいることがあるように、システムも規模が大きくなると、それなりのツール群と頑丈なデーターベースソフトと熟練した技術者が要ります。 実際計画した作業が、実際走らせると、1晩では終わらないで、根本から、システムを見直しなど起こっているといわれています。 プログラムを組んでいても、実際かかる時間はなかなか想像しにくいものです。 まずテストで500万件のREAD-WRITEを(言語ソフトやデータベースソフトで)して、実感をつかむのも必要ではないでしょうか。 ーー 量は質に転化する(出典はヘーゲルの弁証法?) 多量になると、少量の場合の延長線で考えてはならない、と私は解釈してます。いろんな場面で、この言葉を思い出します。

noname#44485
質問者

お礼

こんばんは。ご回答ありがとうございます。 全体像について私なりにご説明させていただきますね。 システムの目的は、 DrSumというデータウエアハウス経由で各部署が自部署の売上集計を参照できるようにする ということです。 そのために、DrSumが参照する指定フォルダにCSV(マスタ系3ファイル、月次集計のトランザクション系1ファイル)を生成したいです。 想定している手順は、  1.データベース管理会社のサーバーに毎朝こちらで指定した形の   CSVファイル(上記マスタ系3ファイル、トランザクション系1ファイル×3(=ネットワーク負荷の問題で直近3ヶ月分))   を毎朝生成してくれます。  2.そのファイルをこちらのサーバーにコピー(既存ファイルは上書き)します。  3.フォルダ内のファイル(3年分の過去ファイルと)を全てマージします。  4.マージしたファイルを部署別データに分割コピーし、アクセス権限の設定された各フォルダに配布します。 質問させていただいたのは、4.なのですが、全社データを自動分割したい理由としては  1.現状の購入内容のDrSum上ではアクセス権限を設定出来ないため、   フォルダのアクセス権限で自部署の売上集計だけを参照できるようにしたい  2.部署別に分けたファイルを毎朝生成してもらうことは可能ですが、   部署変更のたびにDB管理会社に変更を依頼したくない というオーダーからです。 >システム設計に無理は無いでしょうね。 無理があるのか判断できるほど分っている自信がありませんので、答えに窮してしまいますが、 無理がある気がモロモロのアドバイスよりして参りました。 3.のマージがReadAllでガツガツ結合したら、(以前3.で質問させていただいたものですhttp://okwave.jp/qa3122444.html) 思いのほか早かった(10分弱)もんですから、 その流れでテキストって処理早いんだなぁ。。。っと思い、 夜間バッチだから多少時間かかっても全然大丈夫!とも思い油断しておりました。 >多量になると、少量の場合の延長線で考えてはならない 勉強になります。 すみません、今日は回答を拝見したのが遅かったものですから、 あまりご回答を真に理解してお礼を書かせていただけてないのですが、 明日、回答を熟読させていただきたいと思います。 お忙しい中何度もお時間をさいていただきありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

データ数(レコード数)が問題です。 (1)6万500件以下ーー>エクセル (2)100万件程度以下ーー>エクセル2007 (3)アクセルーー>とりあえず100万件以下 というのも、読み込めるレコード数+ソートを考えているからです。 ーー 一番早いのはソート法です。 部署名(部署コードがあれば最適)でcsvファイルをソートする。 ソート・キーが変わるごとにアウトプットファイルを切り替える。 ーーー 問題は、7万件以上のレコードをソートする、ソートプログラムが あるかどうかです。 ソートプログラムのの自作は余りお勧めできません。 パソコン以外の大型。中型コンピュターでは、昔は必ずソート・マージのメーカー製ソフトが付いてきたし、良く使った。 ウィンドウズになってソートユテリティプログラムは余り聞かない。 アクセスでは容易にソートできてしまうし、エクセルもそうです。 勉強すれば、エクセルからでも、SQLが使えるので使える手もある。 アクセスは使えるのかな。 1レコード読んで1レコードを書く繰り返しが処理速度は一番早いし予想外に止まることが少ない。

noname#44485
質問者

お礼

おはようございます。 ご回答いただきありがとうございます。 >データ数(レコード数)が問題です。 100万件ですか!ぜんぜんダメみたいですー! 1ヶ月分のファイル(レコード数15万件)×3年(36ヶ月)=540万件 なので、 アドバイスをお聞きするまでは、 3年分を結合したものを部署別に分割しようかと思っていましたが、 部署別に分割したファイルを3年分結合するしかなさそうなんですね。 WHSで実行するVBSは、 OFFICEアプリケーションに依存しない(=直接メモリで展開)ので、 PC本体の性能だけの問題なのかなぁ。。。という理解でした。 時間は激しくかかれど、いつかは実行し終わるのかと悠長に思っておりました(笑) OFFICEアプリケーションを介さず、 変数を使ってソートをするっていうのをイメージしていたのですが、 現実としては無理ってことなんでしょうか? (よく考えてませんがもともと論理的に不可能かも???) >ソートプログラムのの自作は余りお勧めできません。 ともおっしゃられていますし。。。 ついついソートしてから切り分けようかと思ってしまったのですが、 全てのレコードにアクセスしてソートするくらいなら、 ファイルを部署名分作成しておいて、 >1レコード読んで1レコードを書く繰り返しが してもおっしゃる通り同じことですよね。。。 タスクスケジューラーより 毎朝バッチファイル経由でこのプログラムを自動実行しようと思っており、 実行するサーバーには現在ACCESSがインストールされていないのと、 ACCESSを使用する理由もなさそうだったので、VBSを考えておりましたが、 ACCESSでの実行を視野にいれつつ、 本日もうちょっとソートなどを調べてみようかと思います。 またお気づきの点がありましたら、是非アドバイスよろしくお願いします。 お忙しいところご検討くださって本当に感謝です。

関連するQ&A