秀丸マクロの作成方法

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

秀丸マクロの作成方法

あるディレクトリに巨大なログが大量にあります。 このファイルを一つずつオープンし、中からある文字列「abcde」のある行を抜き出し、該当行を一つのファイルに出力した上で、そのファイルから文字列「1」のある行をファイルに出力したいとおもいます。 マクロの書き方を教えてもらえませんでしょうか。 宜しくお願いします。 例 1.log 1213132abcde12343434243 31313144352421432424234 343333333abcde333333333 2.log foaoaosooaoaoaoaoaoaoao 32132132abcde3432432432 42423432432424325424233 ↓ 1213132abcde12343434243 343333333abcde333333333 32132132abcde3432432432 ↓ 1213132abcde12343434243 32132132abcde3432432432

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

  • ベストアンサー
  • 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

  • 秀丸マクロについて質問です。

    秀丸マクロについて質問です。 秀丸で編集されたテキスト文書の中でabcdefgという文字列がある行を検索し、 その行情報を取得し、その行の隣にある文字列(下記の例では123456)を返す にはどのようにすればよいでしょうか? ご回答よろしくお願いします。 (例) 567行目に以下の文があるとします。 abcdefg,123456,goukaku

  • エクセル2003のマクロ作成の件

    同一連続セルにあるグループの中で、D列に「完了」があれば、F列に「4」を入力し、その同一連続セル内で、検索し、D列の対応中を探します。その「対応中」の先頭が、完了にした担当者と同じであれば、「9」を。違えば、「0」を。完了は、同一セル内の最後にきていない事もあります。該当しない時や単一セルの時は、何もせず、空白のままにします。A列には、空白行がなく、3万行ほどあります。特定文字を探し、その1行上を探すなどののマクロはできるのですが、条件が重なると、作成が出来ません。今まで、手動で、数値を入れていたのですが、マクロで作成出来ないものでしょうか?マクロ初心者です。

  • エクセルのマクロの作成について

    エクセルのマクロの作成について教えてください!! 一つのセルの中に3行の文字があるとして・・・・ そのセルの2行目と3行目を隣のセルにうつしたいです。 例えば・・ E列の1行目のセルに あいうえお かきくけこ さしすせそ と文字が入っていて、 それを F列の1行目のセルに かきくけこ さしすせそ のみ移動させたいです。 1行~300行ほどあって、さらにデータは増え続けます、手作業での移行が困難になってきました。 そもそも一つのセルの中身の文字の一部を違うところに移動させるマクロは組めるのでしょうか。 当方初心者です。お手柔らかにお願いします。

  • かんたんなエクセルマクロを教えてください!

    エクセルマクロを勉強しはじめたばかりのものです。 列にある、様々な文字列で、同じ名前があったときに、 その個数を出すようにするにはどうしたらよいでしょうか? 【例】   C 1名前 2りんご 3メロン 4いちご 5りんご 6レモン 7メロン 8すいか 9メロン 10空白 Cの列に様々な名前の品物があります。そのときに、行の2~9(9はもっと長いときがあり、制限のないものとします) の中の文字列で、同じものがあったときに、その名前と個数を出すようにしたいのです。(C1は見出しなので省きます) 上記の例でしたら、「りんご」が2個、「メロン」が3個あります。2個、3個という数えた個数はB列の同じ場所の一番上に上書きで 出す形で結果を表示したいと思います。例でいえば、「りんご」は2個だったので、B2に「2」と出力。メロンは3個だったので、 B3に「3」と出力させたいのです(B列にはすでに他の文字列が入っています。それを数値で上書きします。) C列をたどって、同じ文字がないときには、「同じものはありません」とメッセージボックスで出力するようなマクロです。 例ではC9までですが、このケースではC10は空白になります。C100まであったときにはC101が空白です。 こんなカンタンなのもわからないので、ぜひお教えいただけますでしょうか?できるだけ短いものが嬉しいです。使っているエクセルはおはずかしながらEXCEL97です。 よろしくお願いします。

  • TeraTermマクロの連携について

    TeraTermにて出力されたログファイル内の文字列を検索し、コピー。 コピーした文字列をTeraTermマクロ内にてペーストする処理を考えております。 具体的な処理は以下の通りです。 1.何らかのスクリプトファイルを実行し、TeraTermのログファイルを自動で開く。 2.ログファイルの中身から文字列を検索、コピー 3.TeraTermマクロが自動起動。 4.マクロ内にてコピーした文字列をペースト。 これをwindows上で実行したいと考えています。 事実上可能でしょうか? もし可能でしたら、TeraTermマクロと何を組み合わせることによって 当条件をクリアーできますでしょうか? ほか、必須条件等ありましたら教えてください。 よろしくお願いします。

  • 秀丸エディタ・マクロの質問です

    秀丸エディタを使用して、以下のマクロの作成のやり方を教えてください。 元ファイルから必要なデータの抽出・計算を繰り返して下記の例のような形式で表示したいです。 (ここではAAAAA・BBBBB・CCCCC・DDDDD・hijkの表記のある行を抽出し、 「BBBB-AAAAA+1」「DDDDD-CCCCC」の結果をかかった時間1:、かかった時間2:の横に表記する。 これらの作業を10000件以上繰り返す。 ------------------------------------------------ 例)元ファイル 2013/3/6 10:10:10.100 AAAAA 2013/3/6 10:10:10.110 BBBBB 2013/3/6 10:12:12.120 hijk 2013/3/6 10:14:14.140 CCCCC 2013/3/6 10:14:14.150 DDDDD 2013/3/6 10:15:15.130 abcde 2013/3/6 10:15:16.100 AAAAA 2013/3/6 10:15:16.108 hijk 2013/3/6 10:15:16.110 BBBBB 2013/3/6 10:15:18.150 lmn 2013/3/6 10:15:19.140 CCCCC 2013/3/6 10:15:19.150 DDDDD … …(省略:10000行以上) … 2013/3/6 11:18.20.150 DDDDD ------------------------------------------------ 例)ほしい結果 2013/3/6 10:10:10.100 AAAAA 2013/3/6 10:10:10.110 BBBBB 2013/3/6 10:12:12.120 hijk 2013/3/6 10:14:14.140 CCCCC 2013/3/6 10:14:14.150 DDDDD かかった時間1:11msec(2行目-1行目+1) かかった時間2:10msec(5行目‐4行目) 2013/3/6 10:15:16.100 AAAAA 2013/3/6 10:15:16.108 hijk 2013/3/6 10:15:16.110 BBBBB 2013/3/6 10:15:19.140 CCCCC 2013/3/6 10:15:19.150 DDDDD かかった時間1:11msec(9行目-7行目+1) かかった時間2:10msec(12行目‐11行目) … …(省略:10000行以上) … ------------------------------------------------ 現状で以下の2つのマクロを作成しました(元ファイルで実行します) マクロ1.「AA…~DD…」を含む行の抽出+「かかった時間1:、かかった時間2:」の表記をDDDDDの下に挿入するマクロ マクロ2.時間のみの抽出を行うマクロ(下5ケタのみ 例:10100 小数点は削除) これら2つのマクロを同時に動かし、最終的に上記のような形式にまとめる予定です。 (もしかしたら1つのファイルで動かせるのかもしれませんが、わからなかったので二つにわけました;;) 現在、マクロ2.で抽出した時間からどのようにして「BBBB-AAAAA+1」「DDDDD-CCCCC」を 行えばいいか、また、計算した値をどのようにして「かかった時間1:、かかった時間2:」の 横においていけばいいかがわからない状態です。 マクロ自体さわったことがなく、もう一週間悩んでいます。 どなたか馬鹿な私に教えていただけないでしょうか

  • 秀丸を使ったマクロでなんとかならないでしょうか。。

    秀丸を使ったマクロでなんとかならないでしょうか。。 次のような文が書かれたテキストから、 ==== ここから ==== 日曜 犬 月曜 図書館 火曜 散髪 ==== ここまで ==== 次のような文に書き換えたいと思ってます。 ==== ここから ==== 日曜 犬 日曜は犬を、 散歩に連れて行く。 月曜 図書館 月曜は図書館で、 本を読む。 火曜 散髪 火曜は散髪にいく。 ==== ここまで ==== “日曜”を(キーワードA)とすると、“日曜”の次の行の任意の文字列(ここでは犬)を、 次のように代入した文章を(キーワードA)の2行下に追加で書き出すようにしたいんです。 (キーワードA)は(犬)を、 散歩に連れて行く。 上の文章は、仮に(文章A)としてマクロのどこかに記載しないと いけないとかと思いますが。。 同様に、“月曜”を(キーワードB)とすると、図書館は(キーワードb)、 次の文章は(文章B)として考えてます。 そうすると、テキストファイルの例だと構成要素は、 ==== ここから ==== (キーワードA) (キーワードa) (キーワードB) (キーワードb)    ・    ・ ==== ここまで ==== となる感じです。

  • 【秀丸マクロ】IFの使い方

    秀丸マクロでの、IFの使い方が分かりません…。 秀丸でCSVデータの編集をしています。 "文字列1","文字列2","文字列3","文字列4","文字列5", のうち、文字列4だけを見て、条件に合致するものは『行ごと』削除したいんです。 調べて調べて、やっとこ↓までは書いたのですが、 gofiletop; while( code != eof ){ searchdown "^\"((.*?)\",){4}\"(.*?)\"(?\\1)"; deleteline; } IFがないので、これではぜーんぶ消えてしまいます。(苦笑) IFをどういった方法で追加すればよいのか、教えてください。 よろしくお願いします。

  • Excel2007でのマクロの設定について

    Excelのマクロについて質問です。 Excel2007でマクロを設定したいのですが以下の作業はマクロ化出来ますか? 1.特定の文字列を含む行の削除   例:(D11に特定の文字列があった場合、11行を全て削除する) 2.特定の文字列を含む行のうち、一部セルの変更   例:(A列に日付、B列に名前、C列に金額がある場合、B列を検索して該当した名前の列の日付のみ既存の日付の前日にする)   また、これは同時に複数の検索が出来ますか? ご回答お待ちしております。

  • 秀丸のマクロ

    教えて下さい。 Solarisの資源を取得したテキストファイルがあります(iostat、sar、vmstat)。 エクセルでグラフ化したいのですが、コンマが挿入されていないため綺麗に表示できません。 文字列と文字列の間のスペース(n個)はカットし、コンマを一つ入れるように秀丸で編集したい場合、どのようにマクロを作成すればよいか教えて下さい。 例) <生データ> tty sd0 sd1 tin tout kps tps serv kps tps serv kps 3 1 461 19 19 460 18 19 0 0 <マクロ実行後> tty,sd0,sd1 tin,tout,kps,tps,serv,kps,tps,serv,kps 3,1,461,19,19,460,18,19,0 宜しくお願いします。

専門家に質問してみよう