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通过header实现文本文件下载的代码
Aug 08 PHP
PHP大批量数据操作时临时调整内存与执行时间的方法
Apr 20 PHP
深入探讨PHP中的内存管理问题
Aug 31 PHP
利用PHP+JS实现搜索自动提示(实例)
Jun 09 PHP
解析Linux下Varnish缓存的配置优化
Jun 20 PHP
php递归删除目录与文件的方法
Jan 30 PHP
使用PHP生成图片的缩略图的方法
Aug 18 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
Feb 20 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
Sep 04 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
Jun 13 PHP
Yii框架Session与Cookie使用方法示例
Oct 14 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 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(2)――PHP类型
2010/02/15 PHP
PHP-Java-Bridge使用笔记
2014/09/22 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
PHP对象相关知识总结
2017/04/09 PHP
PHP实现的激活用户注册验证邮箱功能示例
2017/06/06 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
js 页面刷新location.reload和location.replace的区别小结
2009/12/24 Javascript
javascript 兼容所有浏览器的DOM扩展功能
2012/08/01 Javascript
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
详解用webpack2搭建angular2的项目
2017/06/22 Javascript
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
Vuejs中使用markdown服务器端渲染的示例
2017/11/22 Javascript
vue 的keep-alive缓存功能的实现
2018/03/22 Javascript
vue 纯js监听滚动条到底部的实例讲解
2018/09/03 Javascript
Vue插值、表达式、分隔符、指令知识小结
2018/10/12 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
JavaScript简易计算器制作
2020/01/17 Javascript
详细分析React 表单与事件
2020/07/08 Javascript
一篇文章看懂JavaScript中的回调
2021/01/05 Javascript
[04:50]DOTA2亚洲邀请赛小组赛第四日 TOP10精彩集锦
2015/02/02 DOTA
django多个APP的urls设置方法(views重复问题解决)
2019/07/19 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
Keras之自定义损失(loss)函数用法说明
2020/06/10 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
selenium如何定位span元素的实现
2021/01/13 Python
德国运动营养和健身网上商店:Myprotein.de
2018/07/18 全球购物
我爱我家教学反思
2014/05/01 职场文书
危爆物品安全大检查大整治工作方案
2014/05/03 职场文书
庆祝儿童节标语
2014/10/09 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
党的群众路线学习笔记
2014/11/06 职场文书
nginx配置ssl实现https的方法示例
2021/03/31 Servers
Windows Server 2012 R2 磁盘分区教程
2022/04/29 Servers