• 締切済み

「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

  • LA_10
  • お礼率100% (2/2)

みんなの回答

回答No.1
LA_10
質問者

お礼

ありがとうございます。 確かにWScript.Execからcmd.exeを呼び出して、findstrをつかえばいけますね。

関連するQ&A

  • ログファイルを後ろから検索し、最初のマッチで止める

    CentOS 5 を使っています。 とある巨大なログファイルがあります。 例えば grep hoge log.txt | tail -1 みたいな事をやっているのですが、これをどうにか高速にできないですかね? 上記だと、ログファイルを全検索しているので効率が悪いです。 (ログファイルはファイルの最後の方に新しい情報が記録されているので、その最新ログが見たいのです) 安易に思いつくのは tac コマンドを使って tac log.txt | grep hoge | head -1 でもいいんですが、grep で「最初のマッチで終了」してくれるオプションもなさそうです。 何か良い方法があればご教示願います。 (ruby 等でスクリプトを書いても良いのですが、何とかワンライナーで出来ないかなと) P.S ちなみに実際の見たい情報は「grep でマッチした前後数行」なので -A や -B オプションを使っています。

  • grepにマッチした正規表現の文字列を取得したい

    grepにマッチした正規表現の文字列を取得し、マッチした文字列を 一覧で取得したいのですが、方法がわかりません。 ※例 grep [0-9][0-9][0-9][0-9][0-9] 検索ファイル名 > 出力ファイル名 不明点あればお知らせください。 よろしくお願いします。

  • 【正規表現】コメントアウトされていない文字列のマッチ

    お世話になっております。 あるファイル群にgrepをかけて結果を取得したいのですが あと半歩という所でつまづいています。 正規表現の考え方のご示唆をいただけませんでしょうか。 宜しくお願い致します。 ■やりたいこと コメントアウトされていない文字列のマッチ ■対象文字列 1行目:ほげ 2行目://ほげ 3行目:// これは否定 ほげ 4行目:ほげ //ここにコメントがはいるとひっかからない(><) ■コメントアウト文字 // 1行目と4行目の「ほげ」をマッチさせたいのです。 正規表現の先読み否定を使って ^(?!//.*)ほげ$ 行頭から、「//」が後に続かなくて「ほげ」がある行末 とやってるのですが、 4行目がひっかかりません。 (?!//.*)の部分で、「//」から「ほげ」までを否定している為だと思うのですが、どのように考え、どのように記載すればスマートでしょうか。 お忙しい所恐縮ですが アドバイスいただければ幸いです。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • Visual C++によるcsvファイルの読み込みについて

    Visual C++を使い始めたばかりの初心者です。 恐縮ながら、Visual C++でのcsvファイルの処理方法についておたずねさせていただければと存じます。 通常のスクリプト言語では、1行読んできて、"," で split をしてやることで、csvファイルを処理できるのですが、Visual C++ではどのようにするのが効率がいいのでしょうか? csvファイルを簡単に取り扱うことができるようなクラスライブラリが提供されているものなのでしょうか?それとも、1文字1文字、コンマを判定していくのが普通なのでしょうか? よろしくお願いいたします。

  • ファイルをある文字列で分割したいです。

    数百MBの1つのログファイルがあります。 これを月ごとのファイルに分割しようと思ってます。 大きすぎて既存環境のviでは開けないので、コマンドやスクリプトで分割しようと考えてます。 とりあえず今年の3月(Mar)~7月(Jul)と5つ月ファイルに分割できればいいです。 perlで1行ずつチェックしようかと思ってましたが、 間違いなくもっと簡単に処理できるかと思い投稿しました ^ ^;; シェルはcshです。 よろしくお願いいたします。

  • ファイルの読み込みについて

    いつもお世話になっています。 早速質問なのですが、VBのファイル処理において固定長データのテキストファイル読み込みの処理で、 固定長データの改行コードがChr(10)になっているデータがあります。 下記のどのOpenステートメントを使用しても、1行読み込みではなく全行読み込まれてしまうのです。 ↓ファイルモード (1)Open strInFile For Input As #intInFile (2)Open strInFile For Random As #intInFile Len=文字数 (3)Open strInFile For Binary As #intInFile ちなみに読み込みのモードは ・Line Input ステートメント ・Get ステートメント の2つを使用してみました。 改行コードの種類に依存せずにデータを1行読み込む方法を教えていただきたいです。

  • VBScriptの読込でのSkipLineの動き

    VBScriptでSkipLineで ファイル読み込みで1行ずつ読み飛ばしをしているのですが、 そこで質問があります。 以下のサンプルを実行すると、 「Microsoft VBScript 実行時エラー: ファイルの最後を超えた入力を行おうとしました。」 が出力され処理が終了します。 ですが、エラーがあっても無視して継続させる 「On Error Resume Next ~ On Error Goto 0」 の記述を行うと期待した結果となります。 エラーが合っても無視しろですから処理が行われるのは当たり前ですが、 1行スキップなのに、何故、エラーとなるのでしょうか。 また、その「On Error Resume Next」の記述をせず対処する方法は あるのでしょか。 ------------------------------------------------- Option Explicit Dim fs Dim fin Dim dir Dim path_in Dim strTemp Set fs = CreateObject("Scripting.FileSystemObject") dir = fs.GetParentFolderName(WSH.ScriptFullName) path_in = fs.BuildPath(dir, "test.txt") Set fin = fs.OpenTextFile(path_in, 1) Do While fin.AtEndOfStream <> True strTemp = fin.ReadLine fin.SkipLine WScript.Echo strTemp Loop fin.Close [test.txt] これは1行目です。 これは2行目です。 これは3行目です。 これは4行目です。 これは5行目です。

  • (VBS) テキストファイル読込での改行コード

    VBAからVBスクリプトへの移植作業をしています。 テキストファイル中に改行コード \r\n と \n が混在しているのですが、 \r\n までを1行として取得したいです。 VBAだと Line Input で取得できたのですが、 VBScriptの場合、FileSystemObject.OpenTextFileで開き .ReadLine で読み込むことになりますが、 ReadLineは \n も行の終端とされてしまい、本来1行のデータが複数行に分かれて読み込まれてしまいます。 .ReadAllで一旦すべてを取得してから Split("\r\n") で分割するという方法は ファイルサイズが膨大だと負荷が掛かるので避けたいです。 \n は、これはこれでデータとして必要なので、削除することはできません。 負荷が掛からず、良い方法があればご教授頂きたく思います。 よろしくお願い致します。

  • テキストファイルを1行ずつ別のファイルに分割する

    400行ぐらいのテキストファイルを、1行ずつ別のファイルに分割したいと思います。 ファイル名は**001.txtのように、(**は任意の文字列、数字は連番)なってくれれば嬉しいです。 どなたかこのような処理のできる簡単な方法をご存じないでしょうか? よろしくお願いします。

  • VBScriptでノートパッド起動

    HTMLのボタン押下イベントで、VBScriptの関数を呼んで その中でノートパッドを開いてます。 VBScriptの関数は、 <Script language = "VBScript"> Sub showReport(FILEPATH) Dim intRtn Dim objShell Set objShell = CreateObject("WScript.Shell") intRtn = objShell.Run("notepad " & FILEPATH, 1, True) Set objShell = Nothing EndSub </Script> です。 ファイルのフルパスを引数で渡して、ノートパッドから開いてます。 この処理を行うと、起動して最初の1回だけ 「このページのActiveXコントロールは、安全ではない可能性があり、ページのほかの部分に影響する可能性があります。ほかの部分に影響しても問題ありませんか?」 というダイアログが表示されてしまいます。 一度「はい」を選択すると、ウィンドウを閉じるまでは出なくなりますが、 また起動した場合はダイアログが表示されます。 このダイアログを表示しない方法を教えていただけますでしょうか? プログラムの記述が悪いのでしょうか? IE6のSP1です。 よろしくお願いします。