【发布时间】: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 C或John O'Brien或 @ 等字符串987654329@ 甚至包含换行符的字符串.... fputcsv() 正确处理所有这些