使用PHP写入.csv文件(数据错误中的逗号)
我正在处理运行查询的PHP语句,然后将数据写入.csv文件。 我遇到的问题是我从服务器收到的一些数据在数据中有逗号,导致.csv文件在错误的地方input数据。 下面我有一个代码的例子。
$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文件中的不同单元格。 有没有解决scheme,使$ result [columnThree]数据保留在一个单元,即使它包含逗号?
你可以用双引号括住这些值:
$row .= ('"'.$result['columnOne'].'", "'.$result['columnTwo'].'", "'.$result['columnThree'].'"\n"');
而不是连接string,我喜欢尽可能使用数组:
$rawCsv = array(); while ($result = $data->fetch_assoc()) { if (count($rawCsv) === 0) $rawCsv[] = '"'.implode('","', array_keys($result )).'"'; $rawCsv[] = '"'.implode('","', $result ).'"'; } $csvString = implode("\n", $rawCsv);
这两种方法在你的数据中都会有一个不同的字符 – 双引号。 考虑到这一点,更好的select是使用fopen
和fputcsv
来创buildCSV数据,而不必考虑它。
如果您打算立即提供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!
尽pipe如此,一些框架/应用程序在内部使用它时要小心输出缓冲。 如果您遇到问题,请尝试使用文件。 如果文件起作用,那么你的框架可能已经在输出缓冲区中做了一些事情。
文档
- 用于逗号分隔值(CSV)文件的 RFC 4180 通用格式和MIMEtypes – 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