まずFより始めよ〜Excelと正規表現で始めるプログラミング〜

technologies

プログラミングしてますか?
どうも GTO です。

「まず隗より始めよ」
という有名な格言があります。

大きなことをするならまずは手近なところから着手するのがよい
とか
物事は言い出した者から始めよ
という意味の言葉です。

転じて、タイトルの「まずFより始めよ」は「プログラミングをするならまずFから始めよ」
という意味を込めております。

ここでいうFは関数のF(Function)であり、
Y = F(X)
F(Function)であります。

X」を入力したら「F」で変換されて「Y」が出力されるということですね。

プログラムも同じで「こういう入力をした時」に「こういう出力が欲しい」という目的のために作られるものです。
※何が出るかわからないAIという例外はありますが……

この「入力 → F → 出力」を実現するための「F」を自在に作れるようになること。
これが、プログラミングができるようになった! と言える一つの指標かと思います。
その後、処理速度やメモリ効率、拡張性や運用のしやすさ、UIUXなどのステップに進むのが良いでしょう。

細かいことは気にせず、まずは「作りたいものを作れるようになること」から始めましょう。

さて、このFを作るための練習として最適なツールがExcel正規表現です(と個人的に思っています)。
これらは、特にデータ集計や作成、整形をパパッとやりたいときに活躍します。
以下に例を示していきますね。

Excelの例

例えば、DBにテストデータとしてユーザ情報を入れておきたい、また取得結果が目的通りかをさっと把握したい場合にExcelが有用です。
本例では、ユーザデータとして「ID、名前、チェック番号」があり、DBクエリの結果として「チェック番号が素数のデータのみ取得できたか」を確認したいとします。
上記確認をざっとするためにDBにデータを入れたいとします(単体テストより前、実装の簡単なチェックくらいのタイミングあたりかと思います)
そのデータをExcelで作っていきます。

Excelを開きシートを用意して、
・A1のセルに「1」
・B1のセルに「=”Insert Into X (id, name, check_no) Values(“&A1&”, “”名前”&A1&”””, “&A1&”);”」
を入れます。
すると、
Insert Into X (id, name, check_no) Values(1, “名前1”, 1);
という文字(SQL)が生成されます。

これを欲しい行数分だけコピーすることで、クエリを量産できます。
あとは実際に取得して、check_no が素数かチェックすればわかります。
※下図参照

え? 使ってるフレームワークでテストデータが作れる?
あるものは使いましょう。

上記以外にも、クエリの取得結果を上記シートの横にペーストして、差分チェックなども容易です(数値なら引き算、文字列ならEXACTを利用すると楽です)
本手法のように、データ生成、データチェックなどいくらでも応用が効くのがExcelです。
エクセルさんとは良い関係を築いていきたいですね。

正規表現の例

正規表現は、指定の文字や文字パターンを検索したり、変更削除したりすることができます。
グルーピングもできるので、文字のグループの順序を変えたり、必要な情報のみ抜粋するなども可能です。
特に、ログデータのような構造が同じ文字列が何行もあるようなデータへの利用が有用です。

例えば下記のようなアクセスログがあったとします。

12.34.56.78 – – [28/Sep/2023:10:27:10 +0900] “GET /index.php HTTP/1.2” 200 3395
127.0.0.1 – – [28/Sep/2023:10:22:04 +0900] “GET /test.php HTTP/1.2” 200 2216

上記から日付と時間だけを取得したいとします。
検索として
(.+)([0-3][0-9]/[a-zA-Z]{3}/20[2-9][0-9]:[0-2][0-9]:[0-5][0-9]:[0-5][0-9])(.+)
を設定し
置換として
$2
を設定する、という正規表現を使うことで
28/Sep/2023:10:27:10
28/Sep/2023:10:22:04
だけを取得できます。

上記は ( ) で囲まれた3つのグループを作っています(下記です)

1 (.+)
2 ([0-3][0-9]/[a-zA-Z]{3}/20[2-9][0-9]:[0-2][0-9]:[0-5][0-9]:[0-5][0-9])
3 (.+) 

置換として$2だけを指定していますので、1と3で指定された文字列は抽出されません。
2で指定された内容については、

・[0-3] が0から3の数値
・[a-zA-Z] がaからZまでの英文字
・[a-zA-Z]{3} がaからZまでの英文字が3文字連続する

といった意味になります。
上記は

・[0-3][0-9] → 日付について
・[a-zA-Z]{3} → 月について
・20[2-9][0-9] → 年について
・[0-2][0-9]:[0-5][0-9]:[0-5][0-9] →時分秒について

をそれぞれ指定しており、そのまとまりをグループとして指定してます。


正規表現は他にも色々な抽出があります。
こういうことがしたいを検索することで、目的に沿った正規表現をつくれるかもしれません

え? AIに聞けば必要な正規表現を教えてくれるから書けなくていい?
そうかもしれませんが、与えられた記法が正しいか、例外はないか、などのためにも自分でも書けるようになっておくといいかもしれません。

Excel+正規表現

さらにExcelと正規表現を組み合わせることで、
・正規表現で各行の文字を分割し、分割したところをタブに置き換える
・上記をコピーしてExcelに貼り付ける(タブごとに別列に分割されているので見やすい)
・貼り付けた情報をソートしたり、必要な部分だけ抜粋する
・(場合によっては)貼り付けたデータから1行だけをコピーして、再度正規表現にかけて分割して、Excelの別シートに貼り付けて整理して……
などのようにして、データの抽出や整理、調査に応用することができます。

プログラミングへ

え? プログラムで一発で実行したい?
上記の経験があれば、必要なパーツや機能、データ整形の流れが分かりましたね。
あとはそれをプログラムにすればよいのです。

どうプログラムを書けばいいか分からない?
流れが理解できて、個々に必要な機能が頭にあるのであれば、あとはそれを文字に起こしてみましょう。
それをGoogle先生やChatGPT先生に聞いてみれば道を示してくれるはずです。

上記ができるようになれば「F」を作るのに必要な流れを考えられるようになっているはずです。
次のステップは「Y」や「X
つまり仕様の定義や整理になります。
これは設計や要件整理/定義と言われるステップになっていくでしょう。

関連記事一覧