CSV(Comma Separated Value)ファイルのフォーマットは、システムが動作するOSなどの環境や、顧客要件により変化します。
システム基本設計でCSVのフォーマットを定める際は、以下のことに配慮します。
- 文字コード(UTF-8(BOM有無)、SHIFT_JISなど)
- 改行コード(CR、LF、CR + LF)
- 囲み文字(「”」や「’」で各値を囲むか、囲まないか)
- エスケープ文字(囲み文字を使用する場合、「”」自体を文字として扱うとき「\”」とする等)
Excelを保存する際、CSV形式を選択することができますが、出力されるのは以下のフォーマットです。
文字コード:SHIFT_JIS
改行コード:CR + LF
囲み文字:なし
エスケープ文字:なし
そのため、Excelから出力されたCSVファイルが、開発プロジェクトのフォーマットに合わない、という状況がしばしば発生します。
今回は、Excelから出力された囲み文字ナシのCSVファイルを、
正規表現置換で「”」で囲み文字アリのCSVに変更についてお伝えします。
CSV出力
ExcelからCSVファイルを出力してみます。
出力するデータです。
名前を付けて保存で、「CSV」を選択します。
出力されたCSVファイルをサクラエディタで開きました。
囲みナシであることが分かります。
正規表現置換
正規表現置換を用いて、囲みナシを囲みアリに変換します。
置換前
(.*?)(,|\r?\n|\r)
置換後
"$1"$2
解説
今回の変換には正規表現置換の「キャプチャ」というものを使用しています。
キャプチャについてはこちらの記事で解説しています。
置換前文字列「(.*?)(,|\r?\ |\r)」は2つのパートに別れています。
(,|\r?\n|\r)
まずは「(,|\r?\n|\r)」の方から解説します。
結論、これは「カンマまたは改行」という意味です。
丸カッコは一旦置いといて、「,|\r?\n|\r」について考えます。
「|」はまたはを表します。
「\r」は改行コードのCR、「\n」は改行コードのLFを表します。
「\r?\n」というのは、「CR + LFまたはLF」という意味です。
(※「?」は直前の文字の0回以上1回以下の繰り返しを表します。)
つまり、「,|\r?\n|\r」は“カンマ”または”CR + LF”または”LF”または”CR”という意味になります。
それを「()」丸カッコで囲むことにより、置換後に「$2」として再利用します。
(.*?)
丸カッコは一旦置いといて、「.*?」について考えます。
.*?は最短一致検索といいます。行頭から検索を開始して、「(,|\r?\n|\r)」が見つかった時点で、検索を終了します。
※最短一致検索についてはこちらの記事で解説しています。
1行目で言うと、「2018/6/8」から検索を開始し、カンマまたは改行が見つかった時点で検索を終了します。
まず「2018/6/8,」まで検索します。「2018/6/8」を$1、「,」を$2にキャプチャします。
その後「ぶどう」から再び検索を開始し、カンマまたは改行が登場した時点で検索を終了します。
「ぶどう」を$1、「,」を$2にキャプチャします。
その後「867円」から再び検索を開始し、カンマまたは改行が登場した時点で検索を終了します。
「867円」を$1、改行コード「CR + LF」を$2にキャプチャします。
2行目以降も同様です。
置換
置換後文字列は「”$1″$2」となっています。
先ほどの置換前の条件でキャプチャした$1と$2を再び使用します。
1行目でいうと、$1に「2018/6/8」が、$2に「,」がキャプチャされています。
“$1″と置換するということは、「2018/6/8」を「”2018/6/8″」に置換するということです。
$2についてはそのままですので「,」をそのまま使用します。
「ぶどう」についても同様に「”ぶどう”」と「,」に置換されます。
「867円」についても「”867円”」に置換され、$2の「CR + LF」はそのまま使用します。
全てを組み合わせると、
「2018/6/8,ぶどう,867円(改行)」→「”2018/6/8″,”ぶどう”,”867円”(改行)」
という置換が行われます。
2行目以降も同様です。
まとめ
今回は、キャプチャを使用した正規表現置換の応用で、
囲みナシCSVを囲みアリCSVに変換する方法についてお伝えしました。
この方法を用いることで、Excelから出力されたCSVファイルを、囲みアリを要件としているシステムに対して食べさせてあげることができます。
キャプチャについては面白い使い方がまだまだありますので、これからもお伝えしていきます!
正規表現についての別記事についてもご覧ください!
★検索
パスワードの正規表現の考え方
「~を含まない行」を検索する方法
「~を含む行」を検索する方法
「~で終わる」を検索する方法
「~で始まる」を検索する方法
正規表現繰り返しの考え方
最短一致検索を行う方法
否定の文字クラス
「または」検索を行う方法
環境による「\d」の動作の違いについて検証
★置換
正規表現置換の考え方
大文字⇔小文字変換を行う方法
キャメルケース⇔スネークケース変換を行う方法
CSVを囲みなし⇒囲みありに変換する方法
CSVファイルの特定のカンマ以降を削除する方法
CSVファイルの必要な箇所だけ残す方法
数字3ケタおきにカンマを挿入する方法
正規表現置換で不要な行を削除し、必要な行だけ残す方法
数字を0埋めする方法
0埋めされた数字を0埋めなしに変換する方法
ファイル名から、拡張子のみを抽出する方法
Javaで正規表現置換を行う方法
また、Udemyという動画教育プラットフォームで動画解説を行っております。
動きを確認しながら丁寧に学習したいという方は、ぜひご覧ください!
コメント