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

yizhihongxing

这里给出详细的攻略:

1. 什么是CSV文件?

CSV即Comma-Separated Values(逗号分隔值),是一种常用的电子表格或数据库存储格式,它把数据存储为纯文本(plain text),每个数据项之间用逗号进行分隔。使用CSV文件进行数据存储的优点是通用性强、文件格式简单,易于读写,适用于大量数据的存储和交互。

2. 为什么需要快速按行读取CSV文件?

如何高效地读取CSV文件是对电子商务、金融类等互联网数据服务的优化需求。这往往需要读取大量的数据,如果使用传统的数据读取方式,比如直接使用PHP的fopen()、fgets(),循环读取每一行数据,一方面速度较慢,另一方面如果CSV文件较大,容易导致内存不足的问题。

3. 如何快速按行读取CSV文件?

为了避免出现上述问题,我们针对大文件读取,需要采用一些特殊的读取方式,比如按块读取。这里推荐一个PHP快速按行读取CSV大文件的封装类分享,封装类中的 getFileIterator() 函数将会返回一个可以快速按行读取CSV大文件的迭代器,过程中的内存占用应该比传统方式小得多,适合处理大量数据。

class CsvFileIterator implements Iterator {
    private $filePointer = null;
    private $currentElement = null;
    private $rowCounter = 0;

    public function __construct($filePath) {
        $this->filePointer = fopen($filePath, 'r');
    }

    public function rewind() {
        $this->rowCounter = 0;
        rewind($this->filePointer);
        $this->currentElement = fgetcsv($this->filePointer);
    }

    public function valid() {
        return !feof($this->filePointer);
    }

    public function key() {
        return $this->rowCounter;
    }

    public function current() {
        return $this->currentElement;
    }

    public function next() {
        $this->rowCounter++;
        $this->currentElement = fgetcsv($this->filePointer);
    }

    public function __destruct() {
        if ($this->filePointer) {
            fclose($this->filePointer);
        }
    }
}

function getFileIterator($filePath) {
    return new CsvFileIterator($filePath);
}

除此之外,我们还可以通过第三方库 SplFileObject 来实现快速按行读取CSV大文件。

$file = new SplFileObject('file.csv');
$file->setFlags(SplFileObject::READ_CSV);
foreach ($file as $row) {
    // 处理每行数据
}

4. 示例说明

示例1

如下是一个示例CSV文件example.csv,它包含了5行数据,每行用逗号分隔:

name,gender,age
Tom,Male,18
Lily,Female,20
Jerry,Male,19
Lucy,Female,21

我们可以采用这个封装类,使用 foreach 循环迭代器,快速按行读取数据:

$fileIterator = getFileIterator('example.csv');
foreach ($fileIterator as $row) {
    // 处理每行数据
    var_dump($row);
}

在处理大量数据的时候,也可以加入分段读取模式:

$fileIterator = getFileIterator('example.csv');
$maxrows = 1000;

for ($i = 0; $i < 1000000; $i += $maxrows) {
    $fileIterator->setMaxRows($maxrows)
        ->setOffset($i);
    foreach ($fileIterator as $row) {
        // 处理每行数据
        var_dump($row);
    }
}

示例2

如下是一个示例CSV文件data.csv,它包含了数以万计的数据:

id,name,age
1,Tom,18
2,Lily,20
3,Jerry,19
4,Lucy,21
...

我们可以通过 SplFileObject 的方式,快速按行读取数据:

$file = new SplFileObject('data.csv');
$file->setFlags(SplFileObject::READ_CSV);
foreach ($file as $row) {
    // 处理每行数据
    var_dump($row);
}

上述示例中的 SplFileObject::READ_CSV 标识告诉文件对象以 CSV 的方式读取文件,然后在 foreach 循环中,我们可以处理每行读取到的数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件) - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • php的4种常用运行方式详解

    下面我将详细讲解“PHP的4种常用运行方式详解”的完整攻略,内容如下: PHP的4种常用运行方式详解 什么是PHP运行方式? PHP 是一种开源、跨平台的服务器端脚本语言,主要用于web应用程序开发。它有许多种不同的运行方式,从而满足不同情况下的开发需求。 4种常用的PHP运行方式 CLI 模式(Command-Line Interface 模式) 此模式是…

    PHP 2023年5月30日
    00
  • PHP实现的敏感词过滤方法示例

    下面我会给出详细的“PHP实现的敏感词过滤方法示例”的完整攻略。 1. 敏感词过滤的背景 在网站内容审核中,为了规范和清爽的内容,我们通常需要过滤敏感词。 敏感词可以是禁止词、敏感词、政治词汇、色情词汇等,过滤敏感词不仅有助于提高内容的质量和规范性,也有助于网站的健康发展。 2. 敏感词过滤的实现方式 敏感词过滤的实现方式通常有两种:一种是基于字典的过滤方式…

    PHP 2023年5月26日
    00
  • 学习php设计模式 php实现单例模式(singleton)

    学习PHP设计模式,其中一种常见的设计模式是单例模式(Singleton)。单例模式指的是一个类只能创建一个实例,适用于需要保持全局状态并且只需要一个实例的情况。 下面我们将通过PHP代码的示例来介绍如何实现单例模式。 1. 基础概念 在单例模式中,一个类只能有一个实例,并且此实例需要在全局中被访问。 在实现单例模式时,需要考虑以下几点: 构造函数必须是私有…

    PHP 2023年5月24日
    00
  • PHP strcmp()和strcasecmp()的区别实例

    我来为您详细讲解“PHP strcmp()和strcasecmp()的区别实例”。 首先,我们需要了解一下strcmp()和strcasecmp()函数的基本作用。它们都用于比较字符串,不同的是: strcmp()是区分大小写的比较字符串函数,如果两个字符串相同则返回0,如果字符串1大于字符串2则返回正数,如果字符串1小于字符串2则返回负数。 strcase…

    PHP 2023年5月26日
    00
  • php遍历目录与文件夹的多种方法详解

    “PHP遍历目录与文件夹的多种方法详解”是一篇介绍如何遍历文件夹中所有文件的文章。以下是完整攻略: 一、使用scandir函数 scandir函数可以列出目录中所有文件和子目录,包括隐藏文件。 $dir = "/path/to/dir"; $files = scandir($dir); foreach($files as $file) {…

    PHP 2023年5月24日
    00
  • PHP正则表达式基本函数 修饰符 元字符和需转义字符说明

    在PHP中,正则表达式是处理文本的重要工具,主要用于搜索、替换和验证文本数据。下面是关于PHP正则表达式的基本函数、修饰符、元字符和需转义字符的详细讲解。 基本函数 在PHP中,正则表达式的常用基本函数有preg_match、preg_match_all、preg_replace和preg_split等。 preg_match preg_match函数用于做…

    PHP 2023年5月26日
    00
  • php单例模式实现方法分析

    PHP单例模式实现方法分析 什么是单例模式? 单例模式是一种创建型设计模式,意味着仅能创建类的一个实例,且该实例能够在应用的各个部分访问。 单例模式的主要目的是限制某个类只能够创建一个实例,这样有助于解决代码中的耗时/消耗资源的问题,以及避免多个实例之间的数据同步和状态管理问题。 单例模式的实现方法 在PHP中实现单例模式,一般有以下两种方法: 1. 懒汉式…

    PHP 2023年5月27日
    00
  • PHP简单读取xml文件的方法示例

    当我们需要读取xml文件并且使用PHP进行处理时,PHP提供了一些内置的函数和类来轻松读取和解析XML数据。下面将介绍一些PHP简单读取xml文件的方法示例。 1. 使用SimpleXML扩展 SimpleXML是一个PHP扩展,提供一组类来解析和处理XML文档。使用SimpleXML可以轻松的遍历和检索XML文件中的元素和属性。 示例1: 读取XML文件,…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部