使用エンクロージャの*すべて*フィールドにfputcsvを強制
質問
私が使用している場合は、 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に囲い文字として空の文字を設定し、配列の各要素にいくつかの引用符を追加することです。
function encodeFunc($value) {
return "\"$value\"";
}
fputcsv($handler, array_map(encodeFunc, $array), ',', chr(0));
あなたがソースに由来していない任意の文字を挿入しないようにしたい場合は、マーティンのの答えに構築配列(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);
周りscrafffingの多くといくつかのやや退屈な文字のチェックの後、私はサンディエゴと Mahn に正しくencasingsを取り除くと、二重引用符で置き換えることfputcsv
のすべてのフィールドに。その後、ダウンロードするブラウザに出力ファイルを。
私はまた、二重引用符は、常に/エスケープされなかったことを確認することができないことの二次問題があった。
具体的にはPHP使用してブラウザに直接出力するときのために://入力ストリームディエゴによって参照されるように。 CSVファイルには、そうでない場合よりもさらにいくつかのスペースを持っているので、Chr(127)
はスペース文字ですが、私は、これはUTF-8でchr(0)
の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;
}
私は、これはいくつかのいずれかのために有用であると思います。