0

我有一个脚本可以将数据从 MYSQL 导出到 CSV 文件。数据是数字、文本和特殊字符。所有字段都用双引号分隔并用逗号分隔。

我需要以下列形式导出数据:

“这是一个 (x2”) 严重语法化的句子。是的,“不”,也许还有更多。”,“0043”,“假”等。

但是,当我将 htmlsepcialchars 应用于每个字段时,我只能让它工作。数据需要保持如上,但是当它进入 Excel 或 Calc 时,一些逗号和单引号等会搞砸。意思是一些句子在一个单元格中,更多在另一个单元格中。

$dataResult = mysql_query("SELECT * FROM data");

while ($rowData = mysql_fetch_row($dataResult)) 
{
    for ($j=0;$j<32;$j++) 
    {
        $csv_output .= '"'.htmlspecialchars($rowData[$j]).'",';
    }

$csv_output .= "\n";

}

4

3 回答 3

1

htmlspecialchars 仅用于转义插入到 HTML 中的数据(如函数名称所示)。对于 CSV 数据,考虑编写一个遵循 CSV 标准的函数,尤其是使用两个引号而不是一个引号。

例如:

function csvspecialchars($msg) {
  return str_replace('"', '""', $msg);
}

可能还有其他字符要转义。查看RFC 4180中的标准。

于 2011-04-16T16:26:18.700 回答
1

根据wikipedia,您可以通过将双引号加倍来逃避双引号(例如,"this is a (x2"") badly grammorize'd sentence. Yes, ""no"", maybe & more.","0043","false")。这也应该解决逗号的问题,我不能说为什么单引号会是一个问题......

于 2011-04-16T16:26:56.137 回答
1

内置fputcsv函数负责输出有效 csv 所需的一切。不幸的是,它只能输出到文件,但评论中有一个解决方法,归功于Guile

<?php
function outputCSV($data) {

    $outstream = fopen("php://output", 'w');

    function __outputCSV(&$vals, $key, $filehandler) {
        fputcsv($filehandler, $vals, ';', '"');
    }
    array_walk($data, '__outputCSV', $outstream);

    fclose($outstream);
}

$mydata = array(
 array('data11', 'data12', 'data13'),
 array('data21', 'data22', 'data23'),
 array('data31', 'data32', 'data23'));

outputCSV($mydata);
/* Output sent :
data11;data12;data13
data21;data22;data23
data31;data32;data23
*/
于 2011-04-16T16:31:42.140 回答