juanparati/csvreader

一个轻量级/快速的CSV读取器,适用于非常大的文件。

1.0 2018-09-30 08:50 UTC

This package is not auto-updated.

Last update: 2024-09-21 11:11:21 UTC


README

关于

CSVReader是一个轻量级且快速的PHP 7.x CSV读取库,适用于大文件。

CSVReader是为了业务和电子商务环境开发的,在这些环境中,可能包含损坏数据的CSV大文件可以导入。

功能

  • 易于使用。
  • 小内存占用(以流的形式读取文件,因此所需的内存很少)。
  • 读取不同编码的文件。
  • 基于字符串和数字引用的标题列映射。
  • 自动列映射。
  • 支持不同的十进制分隔符(欧洲逗号 ",", 英国点 ".")。
  • 类型转换。
  • 货币检查(避免错误解释损坏或错误的货币值)。
  • 检测并忽略空行。
  • 根据列值提取词段。
  • 根据列值删除词。
  • 替换列值。
  • 基于正则表达式排除值。

备注

  • 不支持带有BOM的UTF-16

用法

自定义字段映射(适用于带有标题的CSV)

    $csv = new \Juanparati\CSVReader\CSVReader(
        'file.csv',     // File path 
        ';',            // Column delimiter
        '"',            // Text enclosure
        'UTF-8',        // Charset
        ',',            // Decimal separator
        '\\'            // Escape character
    );
    
    
    // Define a custom map
    $csv->setMapField([
        'name' => ['column' => 'Firstname'],
        'price' => ['column' => 'Retailprice'],
    ],
    0   // Define where the head line. Default: 0 (first line)
    );
    
    // Extract rows sequentially
    while ($row = $csv->readCSVLine())
    {
        echo 'Name: ' . $row['name'];
        echo 'Price: ' . $row['price'];             
    }

自定义字段映射(适用于不带标题的CSV)

    $csv = new \Juanparati\CSVReader\CSVReader(
        'file.csv',     // File path 
        ';'             // Column delimiter
    );
            
    // Define a custom map
    $csv->setMapField([
        'name' => ['column' => 0],
        'price' => ['column' => 3],
    ]);
    
    // Extract rows sequentially
    while ($row = $csv->readLine())
    {
        echo 'Name: ' . $row['name'];
        echo 'Price: ' . $row['price'];             
    }

自动字段映射

    $csv = new \Juanparati\CSVReader\CSVReader(
        'file.csv',     // File path 
        ';'             // Column delimiter
    );
           
    // Define a custom map
    $csv->setAutomaticMapField();
    
    // Extract rows sequentially
    while ($row = $csv->readCSVLine())
    {
        echo 'Firstname: ' . $row['Firstname'];
        echo 'Retailprice: ' . $row['Retailprice'];             
    }

列分隔符

分隔符设置为字符串或常量表示。

可以使用所有类型的分隔符,因此不仅限于列举的分隔符。

字符串封装

当CSV中的字符串未用任何类型的字符封装时,使用封装节点。

十进制分隔符

列转换

可以使用cast属性对列进行转换。

      // Define a custom map
      $csv->setMapField([                
        'price' => ['column' => 'Retailprice', 'cast' => 'float'],
      ]);

可用的转换类型有

  • int
  • integer(int的别名)
  • float
  • string

从列中删除字符

有时需要在特定列中删除某些字符。

      // Define a custom map
      $csv->setMapField([                
        'price' => ['column' => 'Retailprice', 'cast' => 'float', 'remove' => ['EUR', '€'] 
      ]);

替换列中的字符

      // Replace "Mr." by "Señor"
      $csv->setMapField([                
        'name' => ['column' => 'Firstname', 'replace' => ['Mr.' => 'Señor'] 
      ]);

排除标志

有时根据列数据标记行是方便的。

      // Exclude all names that equal to John
      $csv->setMapField([                
        'name' => ['column' => 'Firstname', 'exclude' => ['John'] 
      ]);

在此,每当列"名称"中有单词"John"时,虚拟列"排除"将包含值"true"(布尔值)。

排除参数接受正则表达式。

应用流过滤器

     $csv = new \Juanparati\CSVReader\CSVReader('file.csv');
     $csv->applyStreamFilter('zlib.deflate')

文件信息

可以通过调用"tellPosition"方法来获取当前指针位置的字节数。为了获取文件状态,调用"info"方法将返回文件状态(请参阅https://php.ac.cn/manual/en/function.fstat.php)。

    $csv = new \Juanparati\CSVReader\CSVReader('file.csv');
    echo 'Current byte position ' . $csv->tellPosition() . ' of ' . $csv->info()['size'];

赞助商