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


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

 

 



相关阅读:
Linux下touch命令有什么作用如何使用?
使用jQuery实现input数值增量和减量的方法
编写高性能Javascript代码的N条建议
XP/Win7系统电脑蓝屏提示2345port.sys错误的解决方法
不是Win10.1 微软正准备10月Win10 RTM预览版TH2更新
javascript实现的弹出层背景置灰-模拟(easyui dialog)
sql server中判断表或临时表是否存在的方法
Linux下tar命令的简单使用及相关错误解决方法
Nodejs中session的简单使用及通过session实现身份验证的方法
浅谈JavaScript对象与继承
使用mysqldump导入数据和mysqldump增量备份(mysqldump使用方法)
超赞的动手创建JavaScript框架的详细教程
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
jQuery遍历页面所有CheckBox查看是否被选中的方法
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 孟学农:心在哪里安放全文 在接受区政协工作评议动员会上的表态发言 清晨的祝福 最后的放手,最后的祝福 时间就这样的去了 表面的坚强不过是掩饰内心的伪装 失恋女人给男友的结婚祝福语 庆祝国庆节,分享传播最美的国庆节祝福短信-国庆节-短信大全 会议通知格式范例 求职信标题怎么写 我的暑假安排 教育局党委书记述职报告_述职报告 乔迁之喜贺词大全 描写微笑的好段大全 风言寄语作文800字 2015小学重阳节主题活动总结 燕子读后感600字 善意的谎言辩论会的演讲稿作文500字 参观抗日战争纪念馆思想汇报范文 雨中的洗礼作文750字 法院司法警察大队加强“四化”建设规范司法水平 一件事情两种爱作文450字 公路养护岗位大练兵活动实施方案 你说美不美?作文450字 初中初一作文400字:小超市是如何生存的 观察植物园 长福:只写给你一个人的 拟百劳歌 我的中国梦演讲稿集锦(10篇) 中学团委年终工作总结 《蒙娜丽莎的魅力》导学学案1 一道小学题目作文450字 小学生捉虾作文 把先进性教育成果转化为建设新农村动力 2015白雪歌送武判官归京教学反思 谁能懂得90后我们的忧伤、 说超女~~作文500字 人生本来就是糊涂的,快乐和幸福都藏在糊涂中 十分钟的足球赛作文1500字 2011年端午节活动策划 珍惜这一切,因为在离开的那一天,我们会怀念... 2016法制建设及宣传教育工作计划5篇 蜘蛛网的秘密 《简单道理》读书体会 14年500字一年级小学作文狡猾的狐狸一家 作文300字和爸爸聊谈天 我知道您望女成凤,可是我也需要自由 国旗下讲话 享受学习——造就成功的根基 雾都孤儿(ToRegaintheNatureofGoodness)英文读后感250字 和谐社区演讲稿 三年级开学第一天作文500字

Copyright © 2016 phpStudy |