php FileReader读取大文件特定行数

<?php
/**
 * 使用方法:
 * include('./FileReader.php');
 * $file = __DIR__.'/20190204 103 EDA CA1.csv';
 * $reader = new FileReader($file);
 * $line_number = $reader->get_lines();
 * $data = $reader->get_data(10,10);
 * Class FileReader
 */

class FileReader
{
    private $file_name;
    private $spl_object = null;
    private $error;
    private $file_type;

    public function __construct($file_name = '')
    {
        if ($file_name && file_exists($file_name)) {
            $this->file_name = $file_name;
        }
        $fileExtension = pathinfo($file_name, PATHINFO_EXTENSION);
        if ($fileExtension == 'csv') {
            $this->file_type = 'csv';
        }
    }

    public function set_file_name($file_name)
    {
        if (!$file_name || !file_exists($file_name)) {
            $this->error = 'File invalid';
            return false;
        }
        $this->file_name = $file_name;
        $this->spl_object = null;
    }

    public function get_file_name()
    {
        return $this->file_name;
    }

    private function _file_valid($file = '')
    {
        $file = $file ? $file : $this->file_name;
        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->file_name, 'rb');
        }
        return true;
    }

    public function get_data($length = 0, $start = 0)
    {
        if (!$this->_open_file()) {
            return false;
        }
        if($this->file_type == 'csv'){
            $this->spl_object->setFlags(\SplFileObject::READ_CSV);
        }
        $length = $length > 0 ? $length : $this->get_lines();
        $start = ($start < 0) ? 0 : $start;
        $data = array();
        $this->spl_object->seek($start);
        for($i = 0; $i < $length; ++$i) {
            $dataline = $this->spl_object->current();
            if (empty($dataline)) {
                if($this->spl_object->eof()){
                    break;
                }
                continue;
            } else {
                $data[] = yield $dataline;
            }
            $this->spl_object->next();
        }
        return $data;
    }

    public function get_lines()
    {
        if (!$this->_open_file()) {
            return false;
        }
        $this->spl_object->seek(filesize($this->file_name));
        return $this->spl_object->key();
    }

    public function get_error()
    {
        return $this->error;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值