拆分大csv文件

时间:2017-04-21 15:38:48

标签: php csv

我正在尝试拆分大的csv文件。现在我只能拆分带有50k列的csv文件。每当我尝试拆分100k它就不起作用。

我无法弄清楚什么是错的。

这是我用于100k的分割器的代码:

$inputFile = 'uploads/uploaded.csv';
$outputFile = 'uploads/output';

$rows = array_map('str_getcsv', file($inputFile));
$header = array_shift($rows);

$splitSize = 50000;

$in = fopen($inputFile, 'r');

fgetcsv($in, 1000, ",");

//array for file name
$stored_names = array();

$rowCount = 0;
$fileCount = 1;

//split csv
while (!feof($in)) {
    if (($rowCount % $splitSize) == 0) {
        if ($rowCount > 0) {
            fclose($out);
        }

        $super_file_name = $outputFile . $fileCount++;
        array_push($stored_names,$super_file_name.'.csv');

        $out = fopen($super_file_name. '.csv', 'w');

        //insert header
        fputcsv($out,$header);

        // array_push($stored_names,$out);

    }
    $data = fgetcsv($in);
    if ($data)
        fputcsv($out,$data);
    $rowCount++;
}

fclose($out);

1 个答案:

答案 0 :(得分:1)

我猜测您的问题是基于此代码的内存限制:

$rows = array_map('str_getcsv', file($inputFile));
$header = array_shift($rows);

将整个文件读入内存,将其拆分为数组数组,然后弹出第一行,然后抛弃其余部分。由于您只需要第一行,因此您无需阅读整个文件。而只是做一些像:

$fp = fopen($inputFile, 'r');
$headers = fgetcsv($fp);

然后您已经打开$fp并指向拆分过程的第一个数据行。