- 締切済み
「VBScript」ADODB.Streamにおけるファイル読み込みについて(他
以下の解決方法をご教授願えませんでしょうか。 宜しくお願いいたします。 前提:ギガバイト単位のテキストファイル(サーバのログファイル)を扱うスクリプトを作成したい。 必須機能:grep機能、動作が軽快で早い事 また、できるだけ外部ツールを使用したくない事(サーバ上に載せる事も視野に入る為) 私が行った事: 1. まずテキストファイルとしてgrepするスクリプトを作成。 方法(1) ReadLineで1行ずつ読み込み、正規表現にてマッチする行を変数に格納 その後、その変数をファイルに書き出ししてみた。 ⇒処理速度が遅すぎて使い物にならない。 方法(2) &演算に処理を食い、速度が遅くなる為、一度ファイルを読み込み 正規表現にてマッチしない行を1度に削除し、新しいファイルに書き出してみた ⇒テストファイルだと狙った通りに処理がかなり早くなったが、実ファイルが ギガバイト単位の為、メモリオーバーフローを起こし使い物にならない (ま、そりゃそうだよねorz) 方法(3) &演算に処理を食うのは避けたい為、ReadLineにて行毎に読み込み、 正規表現にてマッチした行をWriteLineにてファイルに書き出し。 ⇒(1)よりは早くなり、ひとまず完成。ただし、それでも処理が遅いのと CPUパワーを使う為に処理中他の作業がし辛いのが問題。 2. そこで、1度捨てた(2)の方法を何とか使えないかと思案し、ファイルを 適当なサイズで分割する形にしようかと思い、以下の分割用スクリプトを作成 ⇒でも、結局LoadFromFileにてメモリ上にファイルを展開する為、 メモリオーバーフローを起こす事に。 要は、c言語のfreadみたいな事ができれば解決できると思うのですが… この方法に限らず、何かいい案があればアドバイスをお願いいたします。 以下、バイナリーにて分割するスクリプト Option Explicit Const FilePath = "分割対象ファイルパス" Const ReadLen = 134217728 Dim bytData, intX intX = 0 With CreateObject("ADODB.Stream") .Open .Type = 1 .LoadFromFile(FilePath) .Position = 0 Do Until .EOS bytData = .Read(ReadLen) With CreateObject("ADODB.Stream") .Open .Type = 1 .Write(bytData) .SaveToFile FilePath & "." & CStr(intX), 1 .Close End With intX = intX + 1 Loop .Close End With
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- khazad-lefty
- ベストアンサー率44% (296/668)
VBSCRIPTにこだわらないなら http://www.atmarkit.co.jp/fwin2k/win2ktips/511findstr/findstr.html
お礼
ありがとうございます。 確かにWScript.Execからcmd.exeを呼び出して、findstrをつかえばいけますね。