为什么 fgets+explode 比 fgetcsv 更快?

sad*_*sdf 1 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

文档说这fgetcsv是一个与 类似的函数fgets,只不过它将结果分割成一个数组。

Sal*_*n A 6

fgetcsv不是简单地围绕新行和逗号分割行...它从头到尾逐个字符地解析文件,处理特殊情况,例如:

aaa,"bbb
ccc",ddd
Run Code Online (Sandbox Code Playgroud)

和:

aaa,"bbb,ccc",ddd
Run Code Online (Sandbox Code Playgroud)

(以上两者都应生成 1x3 数组)。它应该比简单的+fgetsexplode