保守の仕事で、エラーが起きた処理をログで確認し、SQLを書いて手動でやり直すというものがあります。SQLの自動生成にはExcelが便利でよく使っているのですが、この用途で使おうとするとExcelの関数では正規表現を使えないので少し面倒です。今回はログメッセージから特定のパラメータを取り出す方法を簡単にまとめます。
対象のメッセージ
以下のような一般的なフォーマットと思われるメッセージを使います。ここからcompany_idやpersonal_idといったパラメータの値を取り出すのが目的です。
2020-07-19 12:34:56 - [ERROR] 登録に失敗しました。処理を異常終了します。(company_id=1234, personal_id=5678, age=35)
考え方
文字列の一部を取り出す関数にはLEFTやRIGHT、MIDがありますが、今回は文字列の途中から数文字を取り出したいのでMIDを使います。
MID関数の引数には対象の文字列の他に、「何文字目」から「文字数」を取り出すかを指定する必要があります。
特定の文字列を検索するにはFIND関数があります。これには文字列の最初から検索する他に指定した位置から検索するモードもあるので、これをうまく組み合わせます。
Step 1. 開始位置を検索する
以降はcompany_idの値(1234)を取り出す方法を考えていきます。まずはMID関数で指定する開始位置を知りたいので、FIND関数を使います。
=FIND("company_id", A1) // 53
ただしこれだとcompany_id自体が含まれるので、これと “=” の分だけ後ろにずらす必要があります。
=FIND("company_id", A1) + LEN("company_id") + 1 // 64
Step 2. 終了位置を検索する
MID関数に必要なもう1つの引数は文字数ですが、それを調べるために終了位置の検索が必要となります。今回のログフォーマットの場合は「company_idの直後にある “,”」と表現できるので、以下のような数式で書けます。
=FIND(",", A1, {Step1の値}) // 68
Step 3. 文字数を算出する
開始と終了の位置が分かったので、パラメータ値の文字数が計算できます。
={Step3の値} - {Step2の値} // 4
Step 4. パラメータ値を取り出す
これでようやくMID関数の引数が揃いました。
=MID(A1, {Step1の値}, {Step3の値}) // "1234"
Step 2′. 最後のパラメータにも対応する
表にして数式をコピペすれば一気に全パラメータに対応できます。
…と思いましたが、最後のパラメータは “,” ではなく “)” で終了となるのでひと工夫必要です。
=IFERROR(FIND(",", A1, {Step1の値}), FIND(")", A1, {Step1の値}))
どうでもよい呟き
FIND関数で対象と検索文字列を逆に入れてしまって「?」となったり、単純に開始と終了位置を指定して部分文字列を取り出せる関数があれば便利と思ったりするのは僕だけでしょうか?w