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 相关文章推荐
桌面中心(二)数据库写入
Oct 09 PHP
PHP提取数据库内容中的图片地址并循环输出
Mar 21 PHP
PHP 图片上传代码
Sep 13 PHP
支持中文的php加密解密类代码
Nov 27 PHP
PHP编码转换函数 自动转换字符集支持数组转换
Dec 16 PHP
php判断ip黑名单程序代码实例
Feb 24 PHP
php自定义hash函数实例
May 05 PHP
php准确获取文件MIME类型的方法
Jun 17 PHP
PHP基于phpqrcode生成带LOGO图像的二维码实例
Jul 10 PHP
浅析PHP7新功能及语法变化总结
Jun 17 PHP
PHP区块查询实现方法分析
May 12 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
Jun 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的SQL注入过程分析
2012/01/06 PHP
PHP设计模式之结构模式的深入解析
2013/06/13 PHP
php使用ICQ网关发送手机短信
2013/10/30 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
浅析JavaScript中的类型和对象
2013/11/29 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
js实现照片墙功能实例
2015/02/05 Javascript
Jquery插件之Fancybox丰富的弹出层效果附源码下载
2015/12/02 Javascript
jQuery计算文本框字数及限制文本框字数的方法
2016/03/01 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
利用原生JS与jQuery实现数字线性变化的动画
2017/02/24 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
node.js+captchapng+jsonwebtoken实现登录验证示例
2017/08/17 Javascript
Node.js使用cookie保持登录的方法
2018/05/11 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
javascript实现智能手环时间显示
2020/09/18 Javascript
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
Python实现一个服务器监听多个客户端请求
2018/04/12 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
2019/06/17 Python
利用pandas将非数值数据转换成数值的方式
2019/12/18 Python
python分布式爬虫中消息队列知识点详解
2020/11/26 Python
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
皮肤科医师岗位职责
2013/12/04 职场文书
数学系个人求职信范文
2014/01/30 职场文书
能源工程专业应届生求职信
2014/03/01 职场文书
迎国庆演讲稿
2014/09/05 职场文书
房屋租赁协议书
2014/10/18 职场文书
2015年保管员工作总结
2015/04/30 职场文书
运动员入场前导词
2015/07/20 职场文书
话题作文之诚信
2019/11/28 职场文书
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python
搭建zabbix监控以及邮件报警的超级详细教学
2022/07/15 Servers