为什么fgets +爆炸比fgetcsv快?

时间:2019-04-15 11:14:45

标签: php csv

我需要逐行快速读取大型csv文件,并将字段的一部分划分为一个数组。 csv文件有10万行。

// Example 1, works in 3.5 seconds
if(false !== $handle = fopen("data.csv", "r")) {
    while(($data = fgetcsv($handle, 0, ";"))) {
        $arData[] = $data;
    }
}

// Example 2, works in 0.3 seconds
if(false !== $handle = fopen("data.csv", "r")) {
    while(($data = fgets($handle))) {
        $arData[] = explode(";", $data);
    }
}

为什么速度差异如此严重?还是我做错了什么?

文档说fgetcsvfgets类似,除了将结果分成数组。

1 个答案:

答案 0 :(得分:4)

fgetcsv并不只是将行换成新行并用逗号分隔...它从头到尾逐个字符地解析文件字符,处理特殊情况,例如:

aaa,"bbb
ccc",ddd

并且:

aaa,"bbb,ccc",ddd

(以上两项均应导致1x3数组)。它应该比简单的fgets + explode