当前位置:  编程技术>php

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

    来源: 互联网  发布时间:2014-08-26

    本文导语:  CSV大文件的读取已经在前面讲述过了(PHP按行读取、处理较大CSV文件的代码实例),但是如何快速完整的操作大文件仍然还存在一些问题。 1、如何快速获取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即可。

 

 


    
 
 

您可能感兴趣的文章:

  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • php是什么文件 php文件怎么打开
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • PHP源文件加密工具 PHP Screw
  • PHP 'ext/soap/php_xml.c'不完整修复存在多个任意文件泄露漏洞
  • Linux下重编译PHP后Apache竟然不能解析.php文件?
  • 图解找出PHP配置文件php.ini的路径的方法
  • php解压文件代码实现php在线解压
  • PHP大文件上传问题解析 php大文件上传配置参考
  • 查找php配置文件php.ini所在路径的二种方法
  • linux下的php文件放在哪个文件夹下才能访问
  • php导入excel php使用phpexcel导入excel文件
  • php读取文件内容并清空文件
  • 在linux下配的apache的服务,但是读documeroot下的html文件可以,但是.php文件就不行,为什么呢?
  • PHP配置文件设置上传大文件
  • 请教一个linux下命令运行php文件的问题
  • 如何修改PHP+Apache上传文件大小限制
  • PHP读取文件内容后清空文件示例代码
  • 单文件PHP框架 SinglePHP
  • PHP include任意文件或URL介绍
  • mod_php.so文件被删除还有得救吗
  • php通过pack和unpack函数实现对二进制数据封装及解析
  • PHP的Session封装 Zebra_Session
  • PHP的SQL封装脚本 TbsSQL
  • PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
  • php递归获取目录内文件(包含子目录)封装类分享
  • php实现mysql封装类示例
  • Curl封装类Curl.class.php及调用方法
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • php实现读取超大文件的方法
  • php读取超大文件的例子
  • PHP 5.4.19 和 PHP 5.5.3 发布及下载地址
  • IIS7配置PHP图解(IIS7+PHP_5.2.17/PHP_5.3.5)
  • PHP去除html标签,php标记及css样式代码参考
  • php输入流php://input使用示例(php发送图片流到服务器)
  • php通过socket_bind()设置IP地址代码示例
  • PHP转换器 HipHop for PHP
  • php安装完成后如何添加mysql扩展
  • PHP 框架 Pop php
  • PHP的substr() 函数用法
  • PHP的JavaScript框架 PHP.JS
  • PHP介绍及学习网站推荐 iis7站长之家
  • php服务器探针显示php服务器信息
  • php中操作memcache的类及成员列表及php下如何连接memched服务器
  • PHP缓存加速器 Alternative PHP Cache (APC)
  • php中内置的mysql数据库连接驱动mysqlnd简介及mysqlnd的配置安装方式
  • PHP自动化测试 PHP-QAT
  • php将标准字符串格式时间转换成unix时间戳_strtotime
  • PHP 的 HTTP 客户端库 PHP Buzz
  • php session_id()函数介绍及代码实例
  • PHP 调试工具 PHP_Dyn
  • Windows下php 5.3.5和apache2安装配置及测试
  • PHP代码格式化 php.fmt


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3