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中取得image按钮传递的name值
Oct 09 PHP
PHP个人网站架设连环讲(二)
Oct 09 PHP
frename PHP 灵活文件命名函数 frename
Sep 09 PHP
iis下php mail函数的sendmail配置方法(官方推荐)
Apr 25 PHP
php ios推送(代码)
Jul 01 PHP
php防止SQL注入详解及防范
Nov 12 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
Apr 22 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
Jul 06 PHP
PHP微信分享开发详解
Jan 14 PHP
一键生成各种尺寸Icon的php脚本(实例)
Feb 08 PHP
PHP简单获取随机数的常用方法小结
Jun 07 PHP
php插件Xajax使用方法详解
Aug 31 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
第六节--访问属性和方法
2006/11/16 PHP
PHP写杨辉三角实例代码
2011/07/17 PHP
php中使用接口实现工厂设计模式的代码
2012/06/17 PHP
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
php简单获取目录列表的方法
2015/03/24 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
浏览器无法运行JAVA脚本的解决方法
2008/01/09 Javascript
javascript相等运算符与等同运算符详细介绍
2013/11/09 Javascript
Jquery焦点与失去焦点示例应用
2014/06/10 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
原生js实现图片层叠轮播切换效果
2016/02/02 Javascript
jQuery插件ajaxFileUpload使用实例解析
2016/10/19 Javascript
jQuery弹出层插件popShow用法示例
2017/01/23 Javascript
在vue-cli脚手架中配置一个vue-router前端路由
2017/07/03 Javascript
vue 1.x 交互实现仿百度下拉列表示例
2017/10/21 Javascript
原生JS实现轮播图效果
2018/10/12 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
判断iOS、Android以及PC端的示例代码
2018/11/15 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
解决layui弹框失效的问题
2019/09/09 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
Python and、or以及and-or语法总结
2015/04/14 Python
Python使用matplotlib绘制随机漫步图
2018/08/27 Python
Python的高阶函数用法实例分析
2019/04/11 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
Schutz鞋官方网站:Schutz Shoes
2017/12/13 全球购物
马来西亚在线健康商店:Medipal Malaysia
2020/04/13 全球购物
采购类个人求职的自我评价
2014/02/18 职场文书
收银员岗位职责
2015/02/03 职场文书
2015年检验科工作总结
2015/04/27 职场文书
教师考核鉴定意见
2015/06/05 职场文书
李白经典诗之一:全文无一“月”字,却句句有月
2019/07/12 职场文书
不知如何爱孩子,这些方法教会您
2019/08/06 职场文书
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis