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日期时间函数的高级应用技巧
May 16 PHP
第五章 php数组操作
Dec 30 PHP
php实现过滤UBB代码的类
Mar 12 PHP
详解php比较操作符的安全问题
Dec 03 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 PHP
基于thinkPHP框架实现留言板的方法
Oct 17 PHP
PHP串行化与反串行化实例分析
Dec 27 PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 PHP
thinkPHP微信分享接口JSSDK用法实例
Jul 07 PHP
php源码的使用方法讲解
Sep 26 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
Aug 06 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中的PDO类
2015/07/06 PHP
PHP中in_array函数使用的问题与解决办法
2016/09/11 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
PHP中使用OpenSSL生成证书及加密解密
2017/02/05 PHP
laravel获取不到session的三种解决办法【推荐】
2018/09/16 PHP
Javascript 汉字字节判断
2009/08/01 Javascript
鼠标经过显示二级菜单js特效
2013/08/13 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
JavaScript 作用域链解析
2014/11/13 Javascript
javascript的BOM
2016/05/03 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
vue使用$emit时,父组件无法监听到子组件的事件实例
2018/02/26 Javascript
JS添加或删除HTML dom元素的方法实例分析
2019/03/05 Javascript
JavaScript JSON数据处理全集(小结)
2019/08/15 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
vue组件实现移动端九宫格转盘抽奖
2020/10/16 Javascript
go语言计算两个时间的时间差方法
2015/03/13 Python
python实现颜色空间转换程序(Tkinter)
2015/12/31 Python
Python 专题一 函数的基础知识
2017/03/16 Python
python利用高阶函数实现剪枝函数
2018/03/20 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
html5指南-3.如何实现html元素拖拽功能
2013/01/07 HTML / CSS
LightInTheBox西班牙站点:全球商品在线采购
2016/09/22 全球购物
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
大学毕业感言50字
2014/02/07 职场文书
《桃花心木》教学反思
2014/02/17 职场文书
2014年司法所工作总结
2014/11/22 职场文书
2015年高校教师个人工作总结
2015/05/25 职场文书
警示教育片观后感
2015/06/17 职场文书
篮球拉拉队口号
2015/12/25 职场文书
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS
MySQL导致索引失效的几种情况
2022/06/25 MySQL