当我使用 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周围的和一些有些繁琐字符检查后,我通过马恩将正确地去掉encasings并用双引号替换在fputcsv各个领域。然后输出文件浏览器下载。

我也有不能够确保双引号总是/从来没有逃脱的次要问题。

具体地使用PHP直接输出到浏览器时为:如由Diego引用//输入流。 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;
}

我希望这是用于某些一种有用的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top