强制fputcsv为* all *字段使用Enclosure

时间:2010-03-22 01:30:42

标签: php csv fputcsv

当我使用fputcsv向开放文件句柄写出一行时,PHP会将一个封闭字符添加到它认为需要它的任何列中,但是会留下没有这些外壳的其他列。

例如,您可能会得到像这样的行

11,"Bob ",Jenkins,"200 main st. USA ",etc

如果没有在每个字段的末尾添加虚假空间,是否有办法强制fputcsv始终用附件(默认为“)字符包围列?

5 个答案:

答案 0 :(得分:28)

不,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(' ')
)

没有“永远封闭”选项。

答案 1 :(得分:14)

对此解决方案不满意,但这是我所做的和工作的。我们的想法是在fputcsv上设置一个空字符作为外壳字符,并在数组的每个元素上添加一些引号。

function encodeFunc($value) {
    return "\"$value\"";
}

fputcsv($handler, array_map(encodeFunc, $array), ',', chr(0));

答案 2 :(得分:13)

根据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);

答案 3 :(得分:3)

经过大量的讨论和一些有些繁琐的字符检查后,我有DiegoMahn的上述引用代码的版本,它将正确删除包含并在所有引号上替换为双引号fputcsv中的字段。然后将文件输出到浏览器进行下载。

我还有一个次要问题,即无法确定双引号始终/从未转义。

特别适用于使用Diego引用的php://输入流直接输出到浏览器。 Chr(127)是一个空格字符,因此CSV文件有多个空格,但我相信这会回避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;
}

我希望这对某些人有用。

答案 4 :(得分:0)

“快速且肮脏”的解决方案是在所有字段的末尾添加“”(如果您可以接受的话):

<div class="wrapper">
  <div class="container">
    <div class="first">Scroll down</div>
    </div>
  <div class="container">
    <div class="second">Here</div>
    </div>
</div>

PS:为什么它能正常工作?参见Volkerk答案;)