質問
ちょうどここで質問されたのと同じ質問をしようとしていたところでした…。 fputcsv が *すべて* フィールドにエンクロージャを使用するように強制する
質問は
fputcsvを使用して行を書き出す場合 をオープンファイルハンドルに追加すると、PHPは 任意の列を囲む文字 それはそれを必要としていると信じていますが、 他の列は、 エンクロージャ。
たとえば、 このような行
11、「ボブ」、ジェンキンス、「200 main st.」米国 」など
偽のスペースを追加するのに欠けます すべてのフィールドの終わり、何かありますか fputcsv を常に囲むように強制する方法 エンクロージャーの列 (デフォルト ")文字に?
答えは次のとおりです。
いいえ、fputcsv() はフィールドを囲むだけです 以下の条件で
/* enclose a field that contains a delimiter, an enclosure character, or a newline */
if (FPUTCSV_FLD_CHK(delimiter) ||
FPUTCSV_FLD_CHK(enclosure) ||
FPUTCSV_FLD_CHK(escape_char) ||
FPUTCSV_FLD_CHK('\n') ||
FPUTCSV_FLD_CHK('\r') ||
FPUTCSV_FLD_CHK('\t') ||
FPUTCSV_FLD_CHK(' ')
)
「常に囲む」オプションはありません。
すべてのフィールドを囲んだ CSV ファイルを作成する必要があります...最善の解決策は何でしょうか?
前もって感謝します...
解決
独自の関数をロールします - それは難しくありません:
function dumbcsv($file_handle, $data_array, $enclosure, $field_sep, $record_sep)
{
dumbescape(false, $enclosure);
$data_array=array_map('dumbescape',$data_array);
return fputs($file_handle,
$enclosure
. implode($enclosure . $field_sep . $enclosure, $data_array)
. $enclosure . $record_sep);
}
function dumbescape($in, $enclosure=false)
{
static $enc;
if ($enclosure===false) {
return str_replace($enc, '\\' . $enc, $in);
}
$enc=$enclosure;
}
(上記は Unix スタイルのエスケープを使用しています)
C.
他のヒント
回避策:データが 2 次元配列であると仮定すると、強制的に引用符を付ける文字列を追加し、その文字列がデータ (ここでは「#@ @#」) に含まれていないことが確認されてから削除できます。
$fp = fopen($filename, 'w');
foreach ($data as $line => $row) {
foreach ($row as $key => $value) {
$row[$key] = $value."#@ @#";
}
fputcsv($fp, $row);
}
fclose($fp);
$contents = file_get_contents($filename);
$contents = str_replace("#@ @#", "", $contents);
file_put_contents($filename, $contents);
所属していません StackOverflow