• 締切
  • 困ってます

「VBScript」ADODB.Streamにおけるファイル読み込みについて(他

  • 質問No.5031184
  • 閲覧数6469
  • ありがとう数3
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 100% (2/2)

以下の解決方法をご教授願えませんでしょうか。
宜しくお願いいたします。

前提:ギガバイト単位のテキストファイル(サーバのログファイル)を扱うスクリプトを作成したい。
必須機能: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件)

  • 回答No.1

ベストアンサー率 44% (296/668)

お礼コメント
LA_10

お礼率 100% (2/2)

ありがとうございます。
確かにWScript.Execからcmd.exeを呼び出して、findstrをつかえばいけますね。
投稿日時:2009/06/11 23:17
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ