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

Ala*_*orm 37 php csv fputcsv

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

例如,您最终可能会得到这样的一行

11,"Bob ",Jenkins,"200 main st. USA ",etc
Run Code Online (Sandbox Code Playgroud)

如果没有将虚假空间附加到每个字段的末尾,是否有任何方法可以强制fputcsv始终用外壳包含列(默认为")"字符?

Vol*_*erK 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(' ')
)
Run Code Online (Sandbox Code Playgroud)

没有"永远封闭"选项.

  • VolkerK当然是对的.fputcsv无法帮助你解决这个问题(我有同样的问题).让我帮助您快速开始下一次搜索:[http://stackoverflow.com/questions/3933668/convert-array-into-csv](http://stackoverflow.com/questions/3933668 /转换阵列 - 进入 - CSV) (10认同)
  • 伤心,因为fgetcsv失败了Österreich没有双引号! (3认同)
  • @relipse它来自php源代码,在[/ext/standard/file.c php_fputcsv](https://github.com/php/php-src/blob/master/ext/standard/file.c#L1873) (2认同)

小智 18

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

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

fputcsv($handler, array_map(encodeFunc, $array), ',', chr(0));
Run Code Online (Sandbox Code Playgroud)

  • 如果文件是UTF-8,则在文件中包含chr(0)会导致某些导入脚本出现问题 (3认同)

dea*_*ina 16

建立在马丁的回答,如果你想避免将不从源阵列(干任何字符Chr(127),Chr(0)等等),你可以替换,而不是下面的fputcsv()行:

fputs($fp, implode(",", array_map("encodeFunc", $row))."\r\n");
Run Code Online (Sandbox Code Playgroud)

当然,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);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢您的好榜样。我需要始终将所有值括在引号中。而且,我需要强制将行尾改为CR + LF,而不仅仅是LF。本示例解决了两个问题。 (2认同)