🍑
[PHP]囲み文字(エンクロージャ)なしのCSVファイルから囲み文字が「"(ダブルクォーテーション)」のCSVファイルを生成する
囲み文字(エンクロージャ)なしのCSVファイルから囲み文字が「"(ダブルクォーテーション)」のCSVファイルを生成するサンプルコード(という名の覚書き)
用途
- 囲み文字(エンクロージャ)がないCSVファイルをそのまま処理しようとすると、意図しない箇所で文字が途切れてしまう(エスケープされてしまう?)ことがあるため、その対策などに
前提条件
以下のようなCSVファイルに対して処理を行うものとする
- 囲み文字(エンクロージャ): なし
- 文字エンコード: SJIS or UTF-8
- 改行コード: CRLF or LF or CR
コード
読み込むCSVファイル
店舗ID,店舗名,緯度,経度,住所
1010,新鮮スーパー/新宿店,,,
,新鮮スーパー・テスト店,34.83433200051296,135.46974817285448,
PHPプログラム
addEnclosure.php
<?php
$csv = $argv[1]; // コマンドライン引数の第一引数に元ファイルを指定
$file = 'result.csv'; // 結果出力用csv
$sjis = file_get_contents($csv);
// 文字化け対策として一度UTF-8に変換、併せて改行コードもLFに統一
$utf8Lf = str_replace(array("\r\n", "\r"), "\n", mb_convert_encoding($sjis, 'UTF-8', 'SJIS, UTF-8'));
// 囲み文字がないと意図しない箇所で文字が途切れる(エスケープ?)ため応急処置(「"」を適用), 末尾に""が入った場合の置換も実施
$utf8Conv = preg_replace('/""\z/', '', preg_replace('/^/m', '"', preg_replace('/$/m', '"', str_replace(',', '","', $utf8Lf))));
// ファイル出力
file_put_contents($file, $utf8Conv);
出力結果
result.csv
"店舗ID","店舗名","緯度","経度","住所"
"1010","新鮮スーパー/新宿店","","",""
"","新鮮スーパー・テスト店","34.83433200051296","135.46974817285448",""
補足事項
- 囲み文字(エンクロージャ)なしのCSVファイルをfgetcsvで処理しようとしたところ、文字列(サンプルCSVでは店舗名の箇所)のところで、「/新宿店」となったり、そもそもデータとれてなかったりしたので、応急処置として。
- 出力されたCSVでは数値の部分は文字列扱いになるため、後続の処理では適宜型変換すること
→ 参考: 型の相互変換 | php.net
Discussion