【问题标题】:What is the advantages/disadvantages of using fputcsv?使用 fputcsv 的优点/缺点是什么?
【发布时间】:2015-12-11 07:35:46
【问题描述】:

以下代码来自 fputcsv 的文档:

<?php
$time_start = microtime(true);
$list = array (
    array('aaa', 'bbb', 'ccc', 'dddd'),
    array('123', '456', '789'),
    array('"aaa"', '"bbb"')
);

$fp = fopen('file.csv', 'w');

foreach ($list as $fields) {
    fputcsv($fp, $fields);
}

fclose($fp);

$time_end = microtime(true);
$time = $time_end - $time_start;
echo "time is: $time";
?> 

time is: 0.0037028789520264
time is: 0.0036959648132324
time is: 0.0037329196929932

为什么不直接使用下面的代码呢?他们似乎有相同的速度?通过这种方式,您可以控制需要使用什么样的新行,例如\n\r\n

<?php
$time_start = microtime(true);
$list = array (
    array('aaa', 'bbb', 'ccc', 'dddd'),
    array('123', '456', '789'),
    array('"aaa"', '"bbb"')
);

$fp = fopen('file.csv', 'w');

foreach ($list as $fields) {
    fwrite($fp, implode(',', $fields) . "\n");
}

fclose($fp);

$time_end = microtime(true);
$time = $time_end - $time_start;
echo "time is: $time";
?> 

time is: 0.0037031173706055
time is: 0.0037119388580322
time is: 0.0036849975585938

免责声明:我不知道我使用的字段数量是否太少 基准

【问题讨论】:

  • 以下代码不会转义值以创建有效的 csv。试想一个字段在其值中包含例如一个逗号 (,)。与引号字符相同。
  • 所以 fputcsv 是为了正确转义要放在 CSV 上的数据?
  • 不仅您使用的记录数量太少,而且您的基准测试也不正确——您只想对写入部分(循环本身)进行基准测试。使用 10k+ 条记录重试,最好使用实时数据,这样您就可以断言需要按照@arkascha 的建议进行适当的转义。一般来说,重新发明*从来都不是一个好主意。
  • 谢谢。你们给我一些启示。我深以为 CSV 只是一个普通的文本文件(本质上是,但目的不是)。
  • 阅读描述 CSV 文件结构的 RFC 4180,然后将其与您的自制版本实际执行的操作进行比较,如果您的数组包含 A, B and CJohn O'Brien 或 @ 等字符串987654329@ 甚至包含换行符的字符串.... fputcsv() 正确处理所有这些

标签: php fwrite fputcsv


【解决方案1】:

fputcsv 是一个辅助函数。是的,您可以手动完成。在引擎盖下可能会有一些类似的功能。但是这种方式更容易实现并且提高了可读性。直接扔进数组就可以了,不用担心转义等问题。

【讨论】: