PHP快速按行读取CSV大文件的封装类分享_PHP教程

php中文网
发布: 2016-07-13 10:32:54
原创
1217人浏览过

 这篇文章主要介绍了一个php快速按行读取csv大文件的封装类,这个类同时也适用于其它体积较大的文本文件,需要的朋友可以参考下

CSV大文件的读取已经在前面讲述过了(PHP按行读取、处理较大CSV文件的代码实例),但是如何快速完整的操作大文件仍然还存在一些问题。

 

立即学习PHP免费学习笔记(深入)”;

1、如何快速获取CSV大文件的总行数?

 

立即学习PHP免费学习笔记(深入)”;

办法一:直接获取文件内容,使用换行符进行拆分得出总行数,这种办法对小文件可行,处理大文件时不可行;

办法二:使用fgets一行一行遍历,得出总行数,这种办法比办法一好一些,但大文件仍有超时的可能;

办法三:借助SplFileObject类,直接将指针定位到文件末尾,通过SplFileObject::key方法获取总行数,这种办法可行,且高效。

 

立即学习PHP免费学习笔记(深入)”;

具体实现方法:

 

立即学习PHP免费学习笔记(深入)”;

 代码如下:

$csv_file = 'path/bigfile.csv';

$spl_object = new SplFileObject($csv_file, 'rb');

$spl_object->seek(filesize($csv_file));

echo $spl_object->key();

 

立即学习PHP免费学习笔记(深入)”;

2、如何快速获取CSV大文件的数据?

 

立即学习PHP免费学习笔记(深入)”;

仍然使用PHP的SplFileObject类,通过seek方法实现快速定位。

 

立即学习PHP免费学习笔记(深入)”;

代码如下:

$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);

 

立即学习PHP免费学习笔记(深入)”;

 

立即学习PHP免费学习笔记(深入)”;

3、综合上面两点,整理成一个csv文件读取的类:

 代码如下:

class CsvReader {

 private $csv_file;

 private $spl_object = null;

 private $error;

 

立即学习PHP免费学习笔记(深入)”;

 public function __construct($csv_file = '') {

  if($csv_file && file_exists($csv_file)) {

   $this->csv_file = $csv_file;

  }

文心快码
文心快码

文心快码(Comate)是百度推出的一款AI辅助编程工具

文心快码 35
查看详情 文心快码

 }

 

立即学习PHP免费学习笔记(深入)”;

 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;

 }

 

立即学习PHP免费学习笔记(深入)”;

 public function get_csv_file() {

  return $this->csv_file;

 }

 

立即学习PHP免费学习笔记(深入)”;

 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;

 }

 

立即学习PHP免费学习笔记(深入)”;

 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;

 }

 

立即学习PHP免费学习笔记(深入)”;

 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

  $data = array();

  $this->spl_object->seek($start);

  while ($length-- && !$this->spl_object->eof()) {

   $data[] = $this->spl_object->fgetcsv();

   $this->spl_object->next();

  }

  return $data;

 }

 

立即学习PHP免费学习笔记(深入)”;

 public function get_lines() {

  if(!$this->_open_file()) {

   return false;

  }

  $this->spl_object->seek(filesize($this->csv_file));

  return $this->spl_object->key();

 }

 

立即学习PHP免费学习笔记(深入)”;

 public function get_error() {

  return $this->error;

 }

}

 

立即学习PHP免费学习笔记(深入)”;

调用方法如下:

 代码如下:

include('CsvReader.class.php');

 

立即学习PHP免费学习笔记(深入)”;

$csv_file = 'path/bigfile.csv';

 

立即学习PHP免费学习笔记(深入)”;

$csvreader = new CsvReader($csv_file);

 

立即学习PHP免费学习笔记(深入)”;

$line_number = $csvreader->get_lines();

 

立即学习PHP免费学习笔记(深入)”;

$data = $csvreader->get_data(10);

 

立即学习PHP免费学习笔记(深入)”;

 

立即学习PHP免费学习笔记(深入)”;

 

立即学习PHP免费学习笔记(深入)”;

echo $line_number, chr(10);

 

立即学习PHP免费学习笔记(深入)”;

print_r($data);

 

立即学习PHP免费学习笔记(深入)”;

 

立即学习PHP免费学习笔记(深入)”;

 

立即学习PHP免费学习笔记(深入)”;

其实,上述CsvReader类并不只针对CSV大文件,对于其他文本类型的大文件或超大文件同样可用,前提是将类中fgetcsv方法稍加改动为current即可。

 

立即学习PHP免费学习笔记(深入)”;

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/752682.htmlTechArticle这篇文章主要介绍了一个PHP快速按行读取CSV大文件的封装类,这个类同时也适用于其它体积较大的文本文件,需要的朋友可以参考下 CSV大文...
相关标签:
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号