目次
テキストエディタを使ってCSVファイルの編集を行う際、
規則的なルールに基づいて作業を行うことはありませんか?
例えば、下記のようなファイルがあるとします。
最初のカンマ以降を切り取る方法
このファイルからID部分のみを取得する正規表現置換は以下のようになります。
置換前
,.*$
置換後
[空白]
置換すると以下のような結果になります。
置換前の正規表現によって行の中からカンマを探し出し、それ以降の文字を文末まで削除することができました。
解説
この正規表現の意味は、
「,」……そのまま「,」
「.」……何でもいいから1文字
「*」……直前の文字を0回以上繰り返す(今回の場合は「.」)
→つまり、「.*」で何でもいいから0文字以上という意味になります。
「$」……行末の位置を表します
という意味になり、全ての正規表現を組み合わせると「カンマから行末まで、何でもいいから0文字以上」という意味になります。
そのため、画像のこの部分が検索に引っかかります。
それを正規表現置換で空白に置き換えたので、カンマ以降が削除されます。
めでたしめでたし。
ただし、1つ疑問があります。
最後のカンマから行末まで切り取る方法
カンマ以降の文字が検索に引っかかるというのであれば、画像のこの部分についても検索に引っかかるのではないでしょうか?
なぜ最初のカンマ以降が検索に引っかかったのでしょうか?
それは、正規表現は検索に引っかかる箇所が一番長くとれるように動作するからです。
今回でいうと、「カンマから行末まで」を一番長くできるのは一番左の、IDの直後のカンマから行末までです。
(「.」は何でもいいから1文字という意味なので、カンマ自体も「.」に当てはまっています。)
では、一番最後のカンマ以降を空白に置き換えるためにはどうしたらいいでしょうか?
次の方法で置換します。
置換前
,[^,]*$
置換後
[空白]
置換すると以下のような結果になります。
一番最後のカンマから行末までを空白に置換することができました。
解説
先ほどの正規表現との違いは、「.*」を「[^,]」に変更したことです。
「[^]」は否定の文字クラスを表します。
※こちらの記事で詳しく解説しています(否定の文字クラス)
否定の文字クラスの中に「,」を記述し、「[^,]」とすることで、カンマ以外という意味になります。
それと、0回以上の繰り返しを表す「*」を組み合わせて「[^,]*」とすることで、カンマ以外の文字を0回以上繰り返すという意味になります。
つまり「,[^,]*$」は、「カンマから行末まで、カンマ以外の文字を0回以上繰り返す」という意味になります。
裏返して考えると、「カンマが1度現れたら、行末までカンマが再び登場してはいけない」ということです。
そのため、1度カンマが登場してから、再びカンマが登場するこの部分についてはこの検索に引っかかりません。
これが、一番最後のカンマから行末までを置換する方法です。
後ろから2番目のカンマから行末まで切り取る方法
では後ろから2番目のカンマから行末までを削除するにはどうすればいいでしょうか?
それは、上記の応用で実現します。
以下の正規表現を使用します。
置換前
(,[^,]*){2}$
置換後
[空白]
置換すると、以下のような結果になります。
後ろから2番目のカンマから行末までを削除することができました。
解説
先ほどからの変更点として、「$」までの部分を「()」で囲み、直後に「{2}」を付けています。
「()」に囲まれた文字はグループになり、あたかも1文字として扱われます。
「{2}」は繰り返しの基本正規表現で、直前の文字を2回繰り返すという意味です。
つまり、丸カッコで囲まれた文字を2回繰り返すという意味です。
丸カッコで囲まれた文字は先ほどお伝えした、「,[^,]*」です。
これらを組み合わせた「(,[^,]*){2}$」は、「『カンマが現れてから、カンマ以外の文字を0回以上繰り返す』ということを2回繰り返し、行末」という意味になります。
この条件に引っかかるのはこの部分だけになります。
他の箇所はこの条件にマッチしません。
この表現を応用して、「{}」の中の数字を変えることで、好きな位置のカンマから行末までを削除することができます。
{3}にすることで、後ろから3番目のカンマから行末までを検索することができます。
{1}にすることで、1番後ろのカンマから行末までを検索することができます。
まとめ
今回はCSVファイルにおいて、特定のカンマから行末まで自由に切り取る方法についてお伝えしました。
CSVファイルの編集を正規表現置換で一括で行いたい状況ではお役に立てると思います。
ぜひ色々遊んでみて下さい。
正規表現についての別記事についてもご覧ください!
★検索
パスワードの正規表現の考え方
「~を含まない行」を検索する方法
「~を含む行」を検索する方法
「~で終わる」を検索する方法
「~で始まる」を検索する方法
正規表現繰り返しの考え方
最短一致検索を行う方法
否定の文字クラス
「または」検索を行う方法
環境による「\d」の動作の違いについて検証
★置換
正規表現置換の考え方
大文字⇔小文字変換を行う方法
キャメルケース⇔スネークケース変換を行う方法
CSVを囲みなし⇒囲みありに変換する方法
CSVファイルの特定のカンマ以降を削除する方法
CSVファイルの必要な箇所だけ残す方法
数字3ケタおきにカンマを挿入する方法
正規表現置換で不要な行を削除し、必要な行だけ残す方法
数字を0埋めする方法
0埋めされた数字を0埋めなしに変換する方法
ファイル名から、拡張子のみを抽出する方法
Javaで正規表現置換を行う方法
また、Udemyという動画教育プラットフォームで動画解説を行っております。
動きを確認しながら丁寧に学習したいという方は、ぜひご覧ください!
コメント