Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 拆分大型csv文件_Php_Csv - Fatal编程技术网

Php 拆分大型csv文件

Php 拆分大型csv文件,php,csv,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

我正在尝试拆分大型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);

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

$rows = array_map('str_getcsv', file($inputFile));
$header = array_shift($rows);
这会将整个文件读入内存,将其拆分为一个数组,然后弹出第一行,并丢弃其余的。因为您只需要第一行,所以不需要读取整个文件。相反,只需做如下事情:

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

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

是否有任何错误日志?到底是什么不起作用?发生了什么?
file()
将整个文件读取到内存中。你可能达到了内存限制。每当我上传完100k csv文件,它就会停止加载。@AlexHowansky我怎么能增加它?不要增加它。内存不是问题,获取标题行的方法是。也就是说,您将整个文件读入内存只是为了得到第一行。不要那样做。