
CANログ(ascファイル)から特定のIDだけを手っ取り早く抜き出す方法(2)マクロ化
こんばんは、ぶらたんです。
正月に公開した「CANログ(ascファイル)から特定のIDだけを手っ取り早く抜き出す方法」の記事ですが、
この記事で書ききれなかった部分・・・マクロ化について記事を書いていこうと思います。
ある程度の技術者であれば「そんなもん誰でもかけるわ!」とか思われるかも知れませんが、何かしら、どなたかの参考になればと思い記事にしています。レベルの高い方は見るほどの内容ではないのでそっと閉じていただければと思います。
お急ぎの方、「マクロのファイルだけあればいいんじゃ」「プログラムがどうなっていようが知ったこっちゃない」方は↑の目次から「実際のファイル」部分をクリックください。そのうち有料にするかもですが。
この記事では、秀丸エディタ用のマクロをベースに話を進めていきます。かんたんなプログラミング講座になっています。
サクラエディタ用のマクロも作りましたが、基本は同じです。
では始めます。
秀丸用のマクロ
マクロでやること
コードを出す前に、マクロでやること(やりたいこと)を先に書いておきます。
検索したいCAN IDの情報を入力させる
GREPする正規表現の文字列を作る
現在開いているファイルに対してGREPをかける
この3つの処理ができればやりたいことが高速化できるはずです。
コード
実際のコードはこちらになります。
$prefix = "\\s+\\d\\s+(";
$postfix = ")\\s+(Rx|Tx)\\s+d\\s+\\d\\s+";
/* CAN IDを入力させる */
$ids = input("CAN IDを入力してください。複数ある場合は|で区切ってください");
/* 入力結果の確認 */
if (result != false) {
/* 検索文字列を作成 */
$search_word = $prefix + $ids + $postfix;
/* grep */
grep $search_word, filename, "", regular, nocasesense;
}
以下で、詳細について触れていきたいと思います。
検索したいCAN IDの情報を入力させる
ここに該当するのは以下。
/* CAN IDを入力させる */
$ids = input("CAN IDを入力してください。複数ある場合は|で区切ってください");
input()に関しては、秀丸マクロのヘルプを見ていただければよいのですが、この関数をコールすると、入力を促すダイアログボックスが出現します。
引数はそのダイアログボックスに表示される文字列です。実際に出したときの画像が以下。

ダイアログボックスに文字を入力してOKを押すと、入力した文字列が戻り値となります。今回のコードでは文字列変数$idsに格納されます(厳密にはキャンセルを押しても格納されるみたいです)。
OKを押したか、キャンセルを押したかは特殊変数resultで判別できます。
OKを押していればresultはtrueに、キャンセルならfalseになるようです。
GREPする正規表現の文字列を作る
前の記事では直接GREPダイアログに検索要文字列を入力してました。今回はマクロ化によりGREPダイアログすら出さずに、即GREPを始めます。
前記事では、検索しようとしていた文字列は・・・
\s+\d\s+(234)\s+(Rx|Tx)\s+d\s+\d\s+
となっていましたので、(234)の部分を入力した文字列に置き換えて、この検索文字列を作ります。
素直に書くと以下のようになります。
$prefix = "\\s+\\d\\s+(";
$postfix = ")\\s+(Rx|Tx)\\s+d\\s+\\d\\s+";
/* CAN IDを入力させる */
$ids = input("CAN IDを入力してください。複数ある場合は|で区切ってください");
/* 検索文字列を作成 */
$search_word = $prefix + $ids + $postfix;
(234)・・・CAN IDより前の部分を$prefixにあらかじめ定義。
同じように(234)より後ろの部分を$postfixにあらかじめ定義。
そして、入力した文字列を間に挿入します($search_word = $prefix + $ids + $postfix;)。
これでGREPする文字列ができました。
GREP実行
/* grep */
grep $search_word, filename, "", regular, nocasesense;;
秀丸マクロのヘルプによると、GREPを実行するには、grep文(関数ではないようです)を記述する必要があります。形式は、
grep 検索文字列, 検索するファイル, 検索するフォルダ, 検索オプション1, 検索オプション2・・・
になるようなので、
検索文字列:$search_word
検索するファイル:現在のファイル名を表すキーワードfilename
検索するフォルダ:今のフォルダでいいので""
検索のオプション1:正規表現を使用するので、regular
検索のオプション2:大文字小文字を区別したくないので、nocasesense
を入れています。
CANoe/CANalyzerはCAN IDのアルファベットは大文字で出力されていたと思いますが、念のため区別しないでおきます。
これでGREPの実行までコードがかけました。
入力でキャンセル押したときの処理

CAN IDの入力で、何か気が変わってキャンセル(ESCキーを押したときも含む)したときは処理を実行したくありません。
そこで、入力ダイアログボックスの結果がOKを押された場合のみ処理するようにif文 if (result != false)を設けています。
/* CAN IDを入力させる */
$ids = input("CAN IDを入力してください。複数ある場合は|で区切ってください");
/* 入力結果の確認 */
if (result != false) {
(GREP実行・・・省略)
}
個人用で使うマクロなので、この辺は好みでしょうけど。辞めたいときに止まらないので、一応は入れました。
これでマクロは完成です。
終わりに(編集後記)
マクロ自体は正月に作っていたのですが、今回記事にするためにCAN ID23f(敢えて小文字)でGREPしてみました。
引っかからねえ・・・orz
GREPダイアログを出すと、「大文字/小文字の区別」にチェックが入っていたので、grep文実行時に指定がない場合は前回値をそのまま使う仕様だと思われます。
慌てて記事と実際のマクロを直しました(汗)。
実際のファイル
入力するのが面倒な方向けに置いておきます。
使用する際は実際にGREP検索できるか試した上で使用ください。責任とかはとれません。
サクラエディタ用のマクロ
サクラエディタ用のマクロもこちらに置いておきます。やっていることは変わりませんが、使える関数・文法とかが違うので少し面倒な形になっています。
var prefix = "\\s+\\d\\s+(";
var postfix = ")\\s+(Rx|Tx)\\s+d\\s+\\d\\s+";
/* CAN IDを入力させる */
var ids = InputBox("CAN IDを入力してください。複数ある場合は|で区切ってください",
"",
255 /* 適当 */
);
/* 入力結果の確認 */
if (ids != "") {
/* 検索文字列を作成 */
var search_word = prefix + ids + postfix;
/* grep */
var fso = new ActiveXObject("Scripting.FileSystemObject");
var dir = fso.GetParentFolderName(GetFilename());
var filename = fso.GetFileName(GetFilename());
/* 42 = 0x02(この編集中のテキストから検索する未実装らしい) */
/* + 0x08(正規表現) */
/* + 0x20(結果出力は該当行) */
Grep(search_word, filename, dir, 42);
}
上をコピペする場合は、ファイルをShift-JISで保存ください。UTF-8だと文字化けします。
また、大文字小文字の区別は前回値使うような設定はなさそうなので、こちらは対処してません。
このファイルの部分だけ、そのうち有料にするかもです。