用PHP写入.csv文件(数据错误中的逗号)

时间:2015-02-10 21:46:34

标签: php excel csv

我正在处理运行查询的PHP语句,然后将数据写入.csv文件。我遇到的问题是我从服务器收到的一些数据在数据中有逗号,导致.csv文件在错误的位置输入数据。下面我有一个代码示例。

$sql = "Select *
From table;"

$data = mysqli_query($link, $sql);
$row= ("Column One, Column Two, Column Three\n");

while ($result = $data->fetch_assoc()) {
    $row .= ("$result[columnOne], $result[columnTwo], $result[columnThree]\n");
}

$fd = fopen("./filePath.csv", "w") or die ("Error Message");
fwrite($fd, $row);
fclose($fd);

第三列是数据包含逗号的地方,这些逗号会导致它写入.csv文件中的不同单元格。是否有任何解决方案使$ result [columnThree]数据保留在一个单元格中,即使它包含逗号?

1 个答案:

答案 0 :(得分:0)

您可以将值换成双引号:

$row .= ('"'.$result['columnOne'].'", "'.$result['columnTwo'].'", "'.$result['columnThree'].'"\n"');

我喜欢尽可能多地使用数组,而不是连接字符串:

$rawCsv = array();
while ($result = $data->fetch_assoc()) {
    if (count($rawCsv) === 0)
        $rawCsv[] = '"'.implode('","', array_keys($result )).'"';
    $rawCsv[] = '"'.implode('","', $result ).'"';
}
$csvString = implode("\n", $rawCsv);

这两种方法都会在数据中遇到不同的特征 - 双引号。考虑到这一点,更好的选择是使用fopenfputcsv来创建CSV数据,而不必考虑它。

如果您打算立即提供CSV数据供下载,您根本不需要文件,只需将其转储到输出黄油:

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

...如果您确实想要挂起文件,请在所需的输出文件上使用fopen并跳过对ob_start的调用

接下来,汇总您的数据:

fputcsv($file_handle, array(
    'Your',
    'headings',
    'here'
));

while ($result = $data->fetch_assoc()) {
    fputcsv($file_handle, array(
        $result['Your'],
        $result['data'],
        $result['"here"']
    ));
}
fclose($file_handle);

...如果你正在使用一个文件,那么你就完全了!如果您使用输出缓冲区(未使用文件),您可以获取CSV数据并直接将其发送到浏览器:

$csv = ob_get_clean();
echo $csv; // should send headers first!

小心输出缓冲,但是,一些框架/应用程序在内部使用它。如果您遇到问题,请尝试使用文件。如果文件有效,那么你的框架可能已经在使用输出缓冲区了。

<强>文档