使用PHP写入.csv文件(数据错误中的逗号)
我正在处理运行查询的PHP语句,然后将数据写入.csv文件。我遇到的问题是,我从服务器接收的一些数据在导致.csv文件在错误位置输入数据的数据中包含逗号。下面我有一个代码示例。使用PHP写入.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]数据保留在一个单元中,即使它包含逗号?
您可以在双引号包住值:
而是连接字符串的,我喜欢用数组尽可能:
$rawCsv = array();
while ($result = $data->fetch_assoc()) {
if (count($rawCsv) === 0)
$rawCsv[] = '"'.implode('","', array_keys($result)).'"';
$rawCsv[] = '"'.implode('","', $result).'"';
}
$csvString = implode("\n", $rawCsv);
这两种方法都会有尽管在数据中有一个不同的字符 - 双引号。考虑到这一点,更好的选择是使用fopen
和fputcsv
来创建您的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!
小心输出缓冲,虽然一些框架/应用程序使用它内部。如果您遇到问题,请尝试使用文件。如果该文件起作用,那么你的框架可能已经在输出缓冲区中做了一些事情。
文档
- RFC 4180 通用格式和MIME类型逗号分隔值(CSV)文件 - https://tools.ietf.org/html/rfc4180
-
implode
- http://php.net/function.implode -
fopen
- http://php.net/manual/en/function.fopen.php -
fclose
- http://php.net/manual/en/function.fclose.php -
fputcsv
- http://php.net/manual/en/function.fputcsv.php -
ob_start
- http://php.net/manual/en/function.ob-start.php -
ob_get_clean
- http://php.net/manual/en/function.ob-get-clean.php
为什么输出缓冲?缓冲区和'$ csv'将是空的。你没有输出任何东西。 – AbraCadaver 2015-02-10 21:58:25
它在为文件句柄使用输出缓冲区时执行。如果您只是将它写入文件,那么在文件句柄中使用文件可能会更好。我会在答案中记下这一点。 – 2015-02-10 21:59:59
Doh,我读过'fopen'行。 – AbraCadaver 2015-02-10 22:00:52
使用'fputcsv()'写CSV数据,而不是'FWRITE()'。 [参考这里](http://php.net/manual/en/function.fputcsv.php) – 2015-02-10 21:48:43
是的,并使用文本框,或者应用程序如何知道什么逗号是分隔符和什么是数据? – AbraCadaver 2015-02-10 21:56:14