fputcsvを使用して開いているファイルハンドルに行を書き出すと、PHPは必要と思われる列に囲み文字を追加しますが、他の列は囲みなしのままにします。
たとえば、次のような行になる可能性があります
11,"Bob ",Jenkins,"200 main st. USA ",etc
すべてのフィールドの最後に偽のスペースを追加する以外に、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(' ')
)
「常に囲む」オプションはありません。
この解決策には満足していませんが、それは私が行って取り組んだことです。アイデアは、fputcsvのエンクロージャー文字として空のcharを設定し、配列のすべての要素に引用符を追加することです。
function encodeFunc($value) {
return "\"$value\"";
}
fputcsv($handler, array_map(encodeFunc, $array), ',', chr(0));
Martinの回答に基づいて、ソース配列( Chr(127)
、など)に由来しない文字の挿入を避けたい場合は、Chr(0)
代わりにfputcsv()行を次のように置き換えることができます。
fputs($fp, implode(",", array_map("encodeFunc", $row))."\r\n");
確かに、fputs()はfputcsv()よりも低速ですが、出力はよりクリーンです。したがって、完全なコードは次のとおりです。
/***
* @param $value array
* @return string array values enclosed in quotes every time.
*/
function encodeFunc($value) {
///remove any ESCAPED double quotes within string.
$value = str_replace('\\"','"',$value);
//then force escape these same double quotes And Any UNESCAPED Ones.
$value = str_replace('"','\"',$value);
//force wrap value in quotes and return
return '"'.$value.'"';
}
$fp = fopen("filename.csv", 'w');
foreach($table as $row){
fputs($fp, implode(",", array_map("encodeFunc", $row))."\r\n");
}
fclose($fp);
たくさんのスクラブとやや退屈な文字チェックの後、DiegoとMahnによる上記のコードのバージョンがあり、大文字と小文字が正しく削除され、のすべてのフィールドが二重引用符に置き換えられますfputcsv
。次に、ファイルをブラウザに出力してダウンロードします。
また、二重引用符が常に/決してエスケープされていないことを確認できないという二次的な問題もありました。
特に、Diegoが参照するphp://inputストリームを使用してブラウザに直接出力する場合に使用します。Chr(127)
はスペース文字であるため、CSVファイルには他の場合よりもいくつかのスペースがありますが、これによりchr(0)
、UTF-8でのNULL文字の問題が回避されると思います。
/***
* @param $value array
* @return string array values enclosed in quotes every time.
*/
function encodeFunc($value) {
///remove any ESCAPED double quotes within string.
$value = str_replace('\\"','"',$value);
//then force escape these same double quotes And Any UNESCAPED Ones.
$value = str_replace('"','\"',$value);
//force wrap value in quotes and return
return '"'.$value.'"';
}
$result = $array_Set_Of_DataBase_Results;
$fp = fopen('php://output', 'w');
if ($fp && $result) {
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="export-'.date("d-m-Y").'.csv"');
foreach($result as $row) {
fputcsv($fp, array_map("encodeFunc", $row), ',', chr(127));
}
unset($result,$row);
die;
}
これが誰かに役立つことを願っています。
「迅速で汚い」解決策は、許容できる場合は、すべてのフィールドの最後に''を追加することです。
function addspace($v) {
return $v.' ';
}
fputcsv($handle, array_map('addspace', $fields));
PS:なぜそれが機能しているのですか?Volkerkの回答を参照してください;)