如何每批读取文件.csv

时间:2018-11-29 08:21:07

标签: php csv php-5.3

我有一个问题,所以我的.csv

"product";"date";"q"
"8";"1995-05-01";"4"
"8";"1995-05-01";"2"
"8";"2001-05-01";"13"
"8";"2001-05-01";"3"
"9";"1995-05-01";"1"

我大约有100万行。 我正在做这样的事情:

while (($row = fgetcsv($fpointer, 4096, ";")) !== false) {
     $data[$row[0]][$row[2]][] = $row;
}

但是此过程会占用大量内存。我该怎么办?请帮助我。

2 个答案:

答案 0 :(得分:1)

这是因为您使用的内存超出了内存限制,请不要读取所有内存,然后在处理非常大的数据集时进行处理。您可以循环处理批量数据,例如:

$limit = 0;
$data = [];

while($row = fgetcsv($fpointer, 4096, ";")) {
    $limit++;
    $data[$row[0]][$row[2]][] = $row;

    if (1000 <= $limit) {
        // process your data
        $data = [];
        $limit = 0;
    }
}

答案 1 :(得分:0)

您可以使用SplFileObject::fgetcsv

SplFileObject允许您逐行读取,指定大小(SplFileObject::fread)等,而无需将整个文件加载到内存中。

我测试的文件大小最大为3.5GB,没有任何问题。

参考:https://github.com/sridharkalaibala/PHPLogFileViewer