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


Posted in PHP onApril 10, 2014

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即可。

 

 

PHP 相关文章推荐
过滤掉PHP数组中的重复值的实现代码
Jul 17 PHP
使用php将某个目录下面的所有文件罗列出来的方法详解
Jun 21 PHP
discuz加密解密函数使用方法和中文注释
Jan 21 PHP
php中利用explode函数分割字符串到数组
Feb 08 PHP
php Imagick获取图片RGB颜色值
Jul 28 PHP
php实现可用于mysql,mssql,pg数据库操作类
Dec 13 PHP
php eval函数一句话木马代码
May 21 PHP
php获取网站百度快照日期的方法
Jul 29 PHP
php导出csv文件,可导出前导0实例代码
Nov 16 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
Feb 24 PHP
thinkphp框架类库扩展操作示例
Nov 26 PHP
php数值计算num类简单操作示例
May 15 PHP
php实现批量下载百度云盘文件例子分享
Apr 10 #PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
Apr 10 #PHP
PHP按行读取、处理较大CSV文件的代码实例
Apr 09 #PHP
PHP二维数组排序的3种方法和自定义函数分享
Apr 09 #PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
Apr 09 #PHP
PHP扩展模块Pecl、Pear以及Perl的区别
Apr 09 #PHP
排序算法之PHP版快速排序、冒泡排序
Apr 09 #PHP
You might like
php 无限级分类 获取顶级分类ID
2016/03/13 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
PHP迭代器和迭代的实现与使用方法分析
2018/04/19 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
基于Jquery的温度计动画效果
2010/06/18 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
2011/05/10 Javascript
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
2011/07/27 Javascript
基于jquery的loading 加载提示效果实现代码
2011/09/01 Javascript
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
基于SVG的web页面图形绘制API介绍及编程演示
2013/06/28 Javascript
JS如何将UTC格式时间转本地格式
2013/09/04 Javascript
jQuery 事件的命名空间简单了解
2013/11/22 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
node.js报错:Cannot find module 'ejs'的解决办法
2016/12/14 Javascript
关于Vue实现组件信息的缓存问题
2017/08/23 Javascript
React如何利用相对于根目录进行引用组件详解
2017/10/09 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
2018/08/14 Javascript
vue-cli的工程模板与构建工具详解
2018/09/27 Javascript
JavaScript 禁止用户保存图片的实现代码
2020/04/28 Javascript
[01:51]历届DOTA2国际邀请赛举办地回顾 TI9落地上海
2018/08/26 DOTA
十条建议帮你提高Python编程效率
2016/02/16 Python
详解Python中for循环是如何工作的
2017/06/30 Python
关于Tensorflow中的tf.train.batch函数的使用
2018/04/24 Python
python os用法总结
2018/06/08 Python
python实现的读取网页并分词功能示例
2019/10/29 Python
Python多继承以及MRO顺序的使用
2019/11/11 Python
基于python的列表list和集合set操作
2019/11/24 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
思想作风建设心得体会
2014/10/22 职场文书
汽车销售员岗位职责
2015/04/11 职场文书
部门主管竞聘书
2015/09/15 职场文书
java调用Restful接口的三种方法
2021/08/23 Java/Android
Java版 单机五子棋
2022/05/04 Java/Android