🍑

[PHP]囲み文字(エンクロージャ)なしのCSVファイルから囲み文字が「"(ダブルクォーテーション)」のCSVファイルを生成する

2022/05/08に公開

囲み文字(エンクロージャ)なしの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