PHP文件生成CSV,如何正确输出文本

时间:2010-10-21 20:30:06

标签: php csv format

目前我正在开发一个PHP脚本,用于从MySQL数据库中的条目输出CSV文件。我的问题在于如何正确输出值。 MySQL数据库中的许多条目都包含逗号和引号,如果我只是将它们清楚地打印到文件中,它就会破坏CSV文件的格式。

我知道我可以在引号中包围文本,但包含引号的条目会弄乱文件的格式。

我的问题是,我该怎么做才能防止这种情况发生?

另外,新行会影响文件的解释吗?

另外,我宁愿不在PHP中使用fputcsv函数。我试图让PHP脚本输出文件的内容(带有适当的标题),而不是写入新文件。

提前致谢!

此致 celestialorb

3 个答案:

答案 0 :(得分:6)

我认为你对fputcsv的解雇可能为时过早。在fputcsv手册的注释中,有一个例子,他们使用fputcsv输出到浏览器而不是文件。 http://php.net/manual/en/function.fputcsv.php

这是代码,加上一些标题,表明它确实提示用户下载csv文件。

$mydata = array(
 array('data11', 'data12', 'data13'),
 array('data21', 'data22', 'data23'),
 array('data31', 'data32', 'data23'));
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"my-data.csv\"");
outputCSV($mydata);

function outputCSV($data) {
    $outstream = fopen("php://output", 'w');
    function __outputCSV(&$vals, $key, $filehandler) {
        fputcsv($filehandler, $vals, ';', '"');
    }
    array_walk($data, '__outputCSV', $outstream);
    fclose($outstream);
}

答案 1 :(得分:0)

我发现制表符分隔值文件在这些情况下很有用。 TSV不太容易受到数据中逗号等问题的影响。

答案 2 :(得分:0)

该过程称为转义,大多数解析器(包括PHP)使用反斜杠转义字符:

"This string contains literal \"quotes\" denoted by backslashes"

您可以使用addcslashes转义字符串中的字符:

// escape double-quotes
$string = addcslashes('this string contains "quotes"', '"');

echo $string; // 'this string contains \"quotes\"'

如果要用逗号分隔数据数组,可以执行以下操作:

// Escape all double-quotes
foreach ($data as $key => $value)
  $data[$key] = addcslashes($value, '"');

// Wrap each element in double quotes
echo '"' . implode('", "', $data), '"';