PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)

2015-01-24信息快讯网

这篇文章主要介绍了一个PHP快速按行读取CSV大文件的封装类,这个类同时也适用于其它体积较大的文本文件,需要的朋友可以参考下

CSV大文件的读取已经在前面讲述过了(PHP按行读取、处理较大CSV文件的代码实例),但是如何快速完整的操作大文件仍然还存在一些问题。

1、如何快速获取CSV大文件的总行数?

办法一:直接获取文件内容,使用换行符进行拆分得出总行数,这种办法对小文件可行,处理大文件时不可行;
办法二:使用fgets一行一行遍历,得出总行数,这种办法比办法一好一些,但大文件仍有超时的可能;
办法三:借助SplFileObject类,直接将指针定位到文件末尾,通过SplFileObject::key方法获取总行数,这种办法可行,且高效。

具体实现方法:

$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) { if(!$this->_open_file()) { return false; } $length = $length ? $length : $this->get_lines(); $start = $start - 1; $start = ($start < 0) ? 0 : $start; $data = array(); $this->spl_object->seek($start); while ($length-- && !$this->spl_object->eof()) { $data[] = $this->spl_object->fgetcsv(); $this->spl_object->next(); } return $data; } public function get_lines() { if(!$this->_open_file()) { return false; } $this->spl_object->seek(filesize($this->csv_file)); return $this->spl_object->key(); } public function get_error() { return $this->error; } }


调用方法如下:
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);


其实,上述CsvReader类并不只针对CSV大文件,对于其他文本类型的大文件或超大文件同样可用,前提是将类中fgetcsv方法稍加改动为current即可。

 

 

叫你如何修改Nginx与PHP的文件上传大小限制
使用PHP和HTML5 FormData实现无刷新文件上传教程
php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码
PHP实现视频文件上传完整实例
ThinkPHP文件上传实例教程
PHP中使用sleep造成mysql读取失败的案例和解决方法
PHP中读取照片exif信息的方法
php操作XML、读取数据和写入数据的实现代码
Php连接及读取和写入mysql数据库的常用代码
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
php实现读取超大文件的方法
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
php导出csv格式数据并将数字转换成文本的思路以及代码分享
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
php读取大文件示例分享(文件操作类)
免费手机号码归属地API查询接口和PHP使用实例分享
php实现批量下载百度云盘文件例子分享
PHP按行读取、处理较大CSV文件的代码实例
PHP读取大文件的类SplFileObject使用介绍
PHP包含文件函数include、include_once、require、require_once区别总结
yii上传文件或图片实例
PHP使用imagick读取PDF生成png缩略图的两种方法
php读取目录所有文件信息dir示例
PHP读取文件内容后清空文件示例代码
php设置允许大文件上传示例代码
php导入csv文件碰到乱码问题的解决方法
php读取csv实现csv文件下载功能
FireFox浏览器使用Javascript上传大文件
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
php对csv文件的读取,写入,输出下载操作详解
©2014-2024 dbsqp.com