PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件) |
本文标签:PHP,按行读取,大文件,CSV CSV大文件的读取已经在前面讲述过了(PHP按行读取、处理较大CSV文件的代码实例),但是如何快速完整的操作大文件仍然还存在一些问题 。 1、如何快速获取CSV大文件的总行数? 办法一:直接获取文件内容,使用换行符进行拆分得出总行数,这种办法对小文件可行,处理大文件时不可行; 具体实现方法: 复制代码 代码如下: $csv_file = path/bigfile.csv; $spl_object = new SplFileObject($csv_file, rb); $spl_object->seek(filesize($csv_file)); echo $spl_object->key(); 2、如何快速获取CSV大文件的数据? 仍然使用PHP的SplFileObject类,通过seek方法实现快速定位 。 复制代码 代码如下: $csv_file = path/bigfile.csv; $start = 100000; // 从第100000行开始读取 $num = 100; // 读取100行 $data = array(); $spl_object = new SplFileObject($csv_file, rb); $spl_object->seek($start); while ($num-- && !$spl_object->eof()) { $data[] = $spl_object->fgetcsv(); $spl_object->next(); } print_r($data); 3、综合上面两点,整理成一个csv文件读取的类: 复制代码 代码如下: class CsvReader { private $csv_file; private $spl_object = null; private $error; public function __construct($csv_file = ) { if($csv_file && file_exists($csv_file)) { $this->csv_file = $csv_file; } } public function set_csv_file($csv_file) { if(!$csv_file || !file_exists($csv_file)) { $this->error = File invalid; return false; } $this->csv_file = $csv_file; $this->spl_object = null; } public function get_csv_file() { return $this->csv_file; } private function _file_valid($file = ) { $file = $file ? $file : $this->csv_file; if(!$file || !file_exists($file)) { return false; } if(!is_readable($file)) { return false; } return true; } private function _open_file() { if(!$this->_file_valid()) { $this->error = File invalid; return false; } if($this->spl_object == null) { $this->spl_object = new SplFileObject($this->csv_file, rb); } return true; } public function get_data($length = 0, $start = 0) { 调用方法如下: 复制代码 代码如下: include(CsvReader.class.php); $csv_file = path/bigfile.csv; $csvreader = new CsvReader($csv_file); $line_number = $csvreader->get_lines(); $data = $csvreader->get_data(10);
echo $line_number, chr(10); print_r($data);
|