Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.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文件。准确地说是51427行 是否有一种方法,我只能将所需的行读入数组?这将大大加快速度。您可以直接连接到数据库服务器吗 如果是这样,我会考虑使用像SyLyg这样的第三方程序来导入CSV。 您还可以上载该文件并使用mysql shell直接导入该数据: LOAD DATA INFILE '/path/to/your_file.csv' INTO TABLE table_name FIELDS TERMINATED BY ','; 你能直接连接到数据库服务器吗 如果是这样,

我有一个非常大的CSV文件。准确地说是51427行


是否有一种方法,我只能将所需的行读入数组?这将大大加快速度。

您可以直接连接到数据库服务器吗

如果是这样,我会考虑使用像SyLyg这样的第三方程序来导入CSV。 您还可以上载该文件并使用mysql shell直接导入该数据:

LOAD DATA INFILE '/path/to/your_file.csv' INTO TABLE table_name FIELDS TERMINATED BY ',';

你能直接连接到数据库服务器吗

如果是这样,我会考虑使用像SyLyg这样的第三方程序来导入CSV。 您还可以上载该文件并使用mysql shell直接导入该数据:

LOAD DATA INFILE '/path/to/your_file.csv' INTO TABLE table_name FIELDS TERMINATED BY ',';

您的脚本可能花费的时间太长,因此会被终止

您应该在
php.ini
中查找
max\u execution\u time
指令,并将其设置为适合您的值

默认的
max\u execution\u time
设置为30秒,因此您的脚本可能会被终止


如果您还有需要限制时间的脚本,那么可以通过调用
set_time_init()来单独执行

您的脚本可能花费的时间太长,因此会被终止

您应该在
php.ini
中查找
max\u execution\u time
指令,并将其设置为适合您的值

默认的
max\u execution\u time
设置为30秒,因此您的脚本可能会被终止


如果您还有需要限制时间的脚本,那么可以通过调用
set_time_init()来单独执行

您是否尝试过使用bash/shell(如果您在linux上)将csv导入mysql?您还可以使用ruby、perl或诸如此类的工具,因为我认为这是您应该使用的工具,而不是php(或任何web应用程序)来导入文件。

您是否尝试过使用bash/shell(如果您使用linux)将csv导入mysql?您还可以使用ruby、perl或诸如此类的工具,因为我认为这是您应该使用的工具,而不是php(或任何web应用程序)来导入文件

这会将整个CSV文件读取到一个数组中

所有的50000多行

通过逐行读取(fgets())并将每个(需要的)行添加到数组中,从PHP前进到想要的文件块的开头;您可以使用fgetcsv()获取该行的数组

编辑:我不知道确切的细节,但我感觉将所有内容读入数据结构的成本远远高于只读取我们需要的内容

这会将整个CSV文件读取到一个数组中

所有的50000多行

通过逐行读取(fgets())并将每个(需要的)行添加到数组中,从PHP前进到想要的文件块的开头;您可以使用fgetcsv()获取该行的数组


编辑:我不知道确切的细节,但我感觉将所有内容读入数据结构的成本远远高于只读取我们需要的内容。

我建议使用快速MySQL加载数据填充命令:


如果这不是一个选项,您可以分割CSV文件(假设访问shell)。

我建议使用快速MySQL加载数据填充命令:


如果这不是一个选项,您可以拆分CSV文件(假设访问shell)。

您可能希望查看CSV文件的流式传输。将开始文件位置、开始位置和作为get参数读取的字节数发送到ProgressiveReader.php

class NoFileFoundException extends Exception {
    function __toString() {
        return '<h1><b>ERROR:</b> could not find ('
                    .$this->getMessage().
                    ') please check your settings.</h1>';
    }
}

class NoFileOpenException extends Exception {
    function __toString() {
        return '<h1><b>ERROR:</b> could not open ('
                    .$this->getMessage().
                    ') please check your settings.</h1>';
    }
}

interface Reader {
    function setFileName($fName);
    function open();
    function setBufferOffset($offset);
    function bufferSize();
    function isOffset();
    function setPacketSize($size);
    function read();
    function isEOF();
    function close();
    function readAll();
}

class ProgressiveReader implements Reader {
    private $fName;
    private $fileHandler;
    private $offset = 0;
    private $packetSize = 0;

    public function setFileName($fName) {
        $this->fName = $fName;
        if(!file_exists($this->fName)) {
            throw new NoFileFoundException($this->fName);
        }
    }

    public function open() {
        try {
            $this->fileHandler = fopen($this->fName, 'rb');
        }
        catch (Exception $e) {
            throw new NoFileOpenException($this->fName);
        }
        fseek($this->fileHandler, $this->offset);
    }

    public function setBufferOffset($offset) {
        $this->offset = $offset;
    }

    public function bufferSize() {
        return filesize($this->fName) - (($this->offset > 0) ? ($this->offset  + 1) : 0);
    }

    public function isOffset() {
        if($this->offset === 0) {
            return false;
        }
        return true;
    }

    public function setPacketSize($size) {
        $this->packetSize = $size;
    }

    public function read() {
        return fread($this->fileHandler, $this->packetSize);
    }

    public function isEOF() {
        return feof($this->fileHandler);
    }

    public function close() {
        if($this->fileHandler) {
            fclose($this->fileHandler);
        }
    }

    public function readAll() {
        return fread($this->fileHandler, filesize($this->fName));
    }
}

您可能需要查看csv文件的流式传输。将开始文件位置、开始位置和作为get参数读取的字节数发送到ProgressiveReader.php

class NoFileFoundException extends Exception {
    function __toString() {
        return '<h1><b>ERROR:</b> could not find ('
                    .$this->getMessage().
                    ') please check your settings.</h1>';
    }
}

class NoFileOpenException extends Exception {
    function __toString() {
        return '<h1><b>ERROR:</b> could not open ('
                    .$this->getMessage().
                    ') please check your settings.</h1>';
    }
}

interface Reader {
    function setFileName($fName);
    function open();
    function setBufferOffset($offset);
    function bufferSize();
    function isOffset();
    function setPacketSize($size);
    function read();
    function isEOF();
    function close();
    function readAll();
}

class ProgressiveReader implements Reader {
    private $fName;
    private $fileHandler;
    private $offset = 0;
    private $packetSize = 0;

    public function setFileName($fName) {
        $this->fName = $fName;
        if(!file_exists($this->fName)) {
            throw new NoFileFoundException($this->fName);
        }
    }

    public function open() {
        try {
            $this->fileHandler = fopen($this->fName, 'rb');
        }
        catch (Exception $e) {
            throw new NoFileOpenException($this->fName);
        }
        fseek($this->fileHandler, $this->offset);
    }

    public function setBufferOffset($offset) {
        $this->offset = $offset;
    }

    public function bufferSize() {
        return filesize($this->fName) - (($this->offset > 0) ? ($this->offset  + 1) : 0);
    }

    public function isOffset() {
        if($this->offset === 0) {
            return false;
        }
        return true;
    }

    public function setPacketSize($size) {
        $this->packetSize = $size;
    }

    public function read() {
        return fread($this->fileHandler, $this->packetSize);
    }

    public function isEOF() {
        return feof($this->fileHandler);
    }

    public function close() {
        if($this->fileHandler) {
            fclose($this->fileHandler);
        }
    }

    public function readAll() {
        return fread($this->fileHandler, filesize($this->fName));
    }
}

呸!忽略这个答案。这是一个复制品。见上文Scorchio提到的fgetcsv()。

呸!忽略这个答案。这是一个复制品。请参见上文Scorchio提到的fgetcsv()。

您是否尝试过使用像
ini\u set(“max\u execution\u time”,0)
这样的最大执行时间?有几个问题:-您如何将文件导入数据库?-您是在导入之前上载文件还是实时读取文件?您是否尝试过使用像
ini\u set(“max\u execution\u time”,0)
这样的最大执行时间?有几个问题:-您是如何将文件导入数据库的?-您是在导入之前上传文件还是实时读取文件?Lotsa代码可能是一次性(或罕见)导入过程。上传csv并使用mysql控制台加载数据。是的,你的权利,除了他不想等待整个文件上传,然后存储“我不高兴在处理之前必须将csv文件的整个51427行放入数组”。此外,还对代码进行了一些测试。哦,一个人的一次性工作是另一个重复的工作,直到你生气并将其自动化。Lotsa代码可能是一次性(或罕见)导入过程。上传csv并使用mysql控制台加载数据。是的,你的权利,除了他不想等待整个文件上传,然后存储“我不高兴在处理之前必须将csv文件的整个51427行放入数组”。此外,还对代码进行了一些测试。哦,一个人的一次是另一次重复的努力,直到你生气并自动完成它。