【问题标题】:Write to .csv file with PHP (Commas in Data Error)使用 PHP 写入 .csv 文件(数据错误中的逗号)
【发布时间】:2015-02-10 21:46:34
【问题描述】:

我正在编写一个运行查询然后将数据写入 .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] 数据保留在一个单元格中,即使其中包含逗号?

【问题讨论】:

  • 使用fputcsv() 写入CSV 数据,而不是fwrite()Reference here
  • 是的,并且使用文本附件,否则应用程序如何知道逗号是分隔符和数据是什么?

标签: php excel csv


【解决方案1】:

您可以将值用双引号括起来:

$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!

请注意输出缓冲,但一些框架/应用程序会在内部使用它。如果您遇到问题,请尝试使用文件。如果文件有效,那么您的框架可能已经对输出缓冲区进行了处理。

文档

【讨论】:

  • 为什么要输出缓冲?缓冲区和$csv 将为空。你还没有输出任何东西。
  • 在使用输出缓冲区作为文件句柄时会这样做。如果您只是要将其写入文件,那么在文件句柄中使用文件可能会更好。我会在答案中注明。
  • @AbraCadaver 没问题!无论如何,这可能需要一些澄清:)
  • @ChrisBaker 非常感谢!我尝试了您列出的第一个选项,但没有成功。 .csv 文件正在生成: "\n"Content"\n"Content"\n" 重复。我已转到您列出的第二种方法,并希望确保您列出的 $baseData 变量与我的 $data 变量相同。非常感谢到目前为止的帮助!
  • @ChuckMN 是的,相同的变量。此外,第一个代码示例包含一个错字,我修复了它,并使示例更接近您的代码。但是,此处显示的代码有点笼统,可根据需要进行更改以适合您的用例。不过,这里重要的一点是概念,而且你最好使用 fputcsv
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 2011-03-29
  • 2021-10-02
  • 1970-01-01
  • 2017-10-02
  • 2012-03-22
相关资源
最近更新 更多