• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:秀丸マクロの作成方法)

秀丸マクロの作成方法

このQ&Aのポイント
  • 秀丸マクロを使って、巨大なログファイルから特定の文字列を抽出しましょう。
  • ログファイルから特定の文字列を抜き出し、新しいファイルに保存する方法を紹介します。
  • マクロを使って、ログファイル内の特定の行を抽出しましょう。

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

  • ベストアンサー
  • Bo_Bo
  • ベストアンサー率65% (97/149)
回答No.5

#2, #3, #4 です。 ■これは、回答ではなく中間報告とお詫びです。 “log01.txt”、“log02.txt”を、各々10万行を超える内容として検証し てみました。 その結果、「応答が帰ってこない」旨のエラー・メッセージが表示され、 マクロが正常に動作しません。 「ファイル名が有効ではありません。  動作環境のワイルドカードの指定が正しいか確認してください。」 とは異なるエラーですが、「巨大なログが大量にある」状態では使用しない でください。 詳しく調査する時間がないので、改善策や原因を提示できません。最初から 「巨大なログが大量にある」と仰っているのに、そのような検証もせず投稿 したことをお詫びします。 因みに、千数百行のファイルが10個程度なら動作することを確認しました。 中途半端な回答をしたことに責任を感じております。 時間がかかることを暇ないなら、次の回答をお待ちください。 そうでないなら、私の発言を全てお忘れください。 --------------------------------------------------------------- ※「Rubyを利用する」と言うのは、駄目かな~ -- pickup_log.rb -- #!ruby -Ks fword = /11025490.*Single Step Transfer|Single Step Transfer.*11025490/ Dir.glob("*.txt"){|file| open(file){|f| while line = f.gets print line if fword =~ line end } } コマンドプロンプトから C:\temp2>ruby pickup_log.rb > 出力.txt

rio_grande
質問者

お礼

Bo_Boさん、ご回答有難うございます。 なるほど。。メッセージが異なるのは気になりますが、私のローカルにあったテキストファイルは、50万行を超えるファイルが10個でした。。 お詫びなんてとんでもないです。 こんなに親切に教えていただけただけで十分です。 Bo_Boさんもお手数ですから、調べて頂かなくても大丈夫です。。ファイル名指定でやってみます。 Rubyは敷居が高いですが、時間があればやってみようと思います。 有難うございました。

rio_grande
質問者

補足

Bo_Boさん、Rubyをやってみました! 結果、何の不具合もなく一発で綺麗に出力できました! 有難うございます! 本当に助かりました。。。 秀丸の件は、気になさらずに。。。 宜しくお願いします。

すると、全ての回答が全文表示されます。

その他の回答 (5)

  • Bo_Bo
  • ベストアンサー率65% (97/149)
回答No.6

> Rubyをやってみました! > 結果、何の不具合もなく一発で綺麗に出力できました! おお!すばらしい。 作業が無事完了して何よりです。 ---- ●今後の為の、秀丸マクロで行おうとしていた作業の解説  (Ruby使いになれば、不必要ですが・・・)   1). 「作業ディレクトリ」にあるテキスト・ファイルを対象に、「1回     目の検索キーワード」でGREPを実行する。   2). 「1回目の検索キーワード」にマッチした全テキストの行が出力さ     れる。   3). GREP整形文のファイル・パス部分を削除する。   4). GREP結果の内容を「2回目の検索キーワード」でローカルGREPを実     行する。   5). 「1回目の検索キーワード」と「2回目の検索キーワード」双方に     マッチした行が得られる。 (3)~(4) を繰り返せば、複数マッチの結果が得られる。

rio_grande
質問者

お礼

Bo_Boさん、度々、ご参考になる情報、有難うございました。 Rubyって秀丸に比べて随分コーディングがシンプルになるんですね。 有難うございました。

すると、全ての回答が全文表示されます。
  • Bo_Bo
  • ベストアンサー率65% (97/149)
回答No.4

以下の条件で動作検証してみました。   1). ドライブ“F”に“temp”ディレクトリを作成。   2). 作成した“temp”ディレクトリに、“log01.txt”と“log02.txt”     を作成。   3). “log01.txt”の内容は、下記4行一組(\nは改行)をコピーして、     500行前後になるまで貼り付けた。     -------------------------     1213132abcde12343434243\n     31313144352421432424234\n     343333333abcde333333333\n     \n     -------------------------   4). “log02.txt”の内容は、下記4行一組(\nは改行)をコピーして、     500行前後になるまで貼り付けた。     -------------------------     foaoaosooaoaoaoaoaoaoao\n     32132132abcde3432432432\n     42423432432424325424233\n     \n     -------------------------   5). 先に投稿したマクロを、以下の設定で実行する。     $findType = "F:\\temp\\*.txt"; // 検索するファイル     $keyword1 = "abcde"; // 1回目の検索キーワード     $keyword2 = "1"; // 2回目の検索キーワード   6). 問題なく実行され、『*** 行を抽出しました。』とメッセージが表     示される。 --------------------------------------------------------------- 「はて?」何が問題なんでしょう!? 上記検証の (5) にあたる変数の設定箇所を、マクロに設定した 【そのままの状態】でコピー&貼り付けをして、補足してもらえませんか。

rio_grande
質問者

お礼

Bo_Boさん、フォロー有難うございます。 大変助かります。 パラメータの設定部は以下のように追記いたしました。 //== ▼マクロここから // $findType = "C:\\temp2\\*.txt"; // 検索するファイル $keyword1 = "Single Step Transfer"; // 1回目の検索キーワード $keyword2 = "11025490"; // 2回目の検索キーワード //-- 上記3つを設定後に実行すること ------------ C:\temp2ディレクトリ配下にはテキストファイルが10個ほどございます。 ファイル名指定だと問題ないのですが。。??

すると、全ての回答が全文表示されます。
  • Bo_Bo
  • ベストアンサー率65% (97/149)
回答No.3

#2 です。 マクロの訂正をします。 「▼マクロここから」行の下13行目にある openfile "/h /g,\"" + $findType + "\"" + $keyword1; のカンマが抜け落ちていました。正しくは、 openfile "/h /g,\"" + $findType + "\"," + $keyword1; です。 以前のマクロでも正常動作しているようですが、念の為、再投稿します。 //== ▼マクロここから ========================================= $findType = ""; // 検索するファイル $keyword1 = ""; // 1回目の検索キーワード $keyword2 = ""; // 2回目の検索キーワード //-- 上記3つを設定後に実行すること --------------------------- $sb = searchbuffer; #so = searchoption; $rb = replacebuffer; #parentHD = hidemaruhandle(0); openfile "/h /g,\"" + $findType + "\"," + $keyword1; // ここ修正 #hd1 = hidemaruhandle(0); if( code == eof ) call NoMatch #hd1, "1"; replaceallfast "^[^:]+: +", "", regular; localgrep $keyword2, icon; #hd2 = hidemaruhandle(0); if( code == eof ) call NoMatch #hd2, "2"; replaceallfast "^[^:]+: +", "", regular; gofiletop; clearupdated; closehidemaruforced #hd1; setsearch $sb, #so; setreplace $rb; message str(linecount2-1) + " 行を抽出しました。"; SAVEAS; endmacro; NoMatch: setactivehidemaru #parentHD; closehidemaruforced ##1; setsearch $sb, #so; setreplace $rb; message $$2 + " 個目の検索キーワードにマッチなし!"; endmacro; //== ▲マクロここまで =========================================

rio_grande
質問者

お礼

Bo_Boさん、親切なご回答どうもありがとうございました!検索対象ファイルをファイル名指定にすると、うまくいくのですが、ディレクトリ内の全ての.txtファイルを検索させると(「C:\\temp\\*.txt」)、「ファイル名が有効ではありません。動作環境のワイルドカードの指定が正しいか確認してください。」と表示されます。 ワイルドカードの指定は秀丸のヘルプで調べてみましたが、「*.txt」という記述でよいようでした。。何がおかしいのでしょうか。。? 追加で大変お手数ですが、もし宜しければご回答して頂けませんでしょうか? 宜しくお願い致します。

すると、全ての回答が全文表示されます。
  • Bo_Bo
  • ベストアンサー率65% (97/149)
回答No.2

下記のマクロで、質問文の条件では動作すると思います。 参考になれば幸いです。 ●検索オプション   検索オプションは、「オプションなし」の状態で検索しています。   大文字小文字の区別や単語単位、正規表現などで検索するには、   それようのフラグを記述しなければなりません。それらは、   ・「秀丸エディターヘルプ」の「秀丸起動時のオプション」の /g 項目   ・「マクロヘルプ」の「grep」項目   を参照してください。 ●検索するファイル($findType)の指定方法   ログファイルの拡張子が .log で、   格納ディレクトリ・パスが c:\foo\bar\log なら、   $findType = "c:\\foo\\bar\\log\\*.log";   となる。   円記号(\)が二重になっていることに注意! ●検索キーワード   検索キーワードに二重引用符や円記号など、特殊な文字を含める場合は、   「マクロヘルプ」の「式について」→「文字列」を参照してください。 ●秀丸の話題   秀丸についての質問などは、   「秀シリーズサポートフォーラム」http://www.maruo.co.jp/hidesoft/   に投稿した方が、迅速、丁寧です。   そこの常連さんは親切な人が多いので、訪問することをお勧めします。   このマクロを持っていって、『こう改造したいけどどうするの?』   でも良いですよ。   「秀丸エディタ マクロ作者会議室」http://www.maruo.co.jp/hidesoft/4/ //== ▼マクロここから ========================================= $findType = ""; // 検索するファイル $keyword1 = ""; // 1回目の検索キーワード $keyword2 = ""; // 2回目の検索キーワード //-- 上記3つを設定後に実行すること --------------------------- $sb = searchbuffer; #so = searchoption; $rb = replacebuffer; #parentHD = hidemaruhandle(0); openfile "/h /g,\"" + $findType + "\"" + $keyword1; #hd1 = hidemaruhandle(0); if( code == eof ) call NoMatch #hd1, "1"; replaceallfast "^[^:]+: +", "", regular; localgrep $keyword2, icon; #hd2 = hidemaruhandle(0); if( code == eof ) call NoMatch #hd2, "2"; replaceallfast "^[^:]+: +", "", regular; gofiletop; clearupdated; closehidemaruforced #hd1; setsearch $sb, #so; setreplace $rb; message str(linecount2-1) + " 行を抽出しました。"; SAVEAS; endmacro; NoMatch: setactivehidemaru #parentHD; closehidemaruforced ##1; setsearch $sb, #so; setreplace $rb; message $$2 + " 個目の検索キーワードにマッチなし!"; endmacro; //== ▲マクロここまで =========================================

すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

このての処理は秀丸のマクロではむずかしいですね。 perlをインストールし、perlで行うのが、もっとも 現実的な方法かとおもいますが、如何でしょうか。

すると、全ての回答が全文表示されます。

関連するQ&A