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);
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |