heller/simple-csv

一个使处理CSV文件尽可能方便和简单的包

dev-main 2024-05-21 06:19 UTC

This package is auto-updated.

Last update: 2024-09-18 10:22:24 UTC


README

尽可能让处理CSV数据变得简单和舒适。

安装

composer require heller/simple-csv

使用

基本数组

use Heller\SimpleCsv\Csv;

$csv = Csv::read('filepath.csv')->toArray();

$csv = Csv::read('http://urlto.csv')->toArray();

头部映射

假设你有一个csv表格,第一行包含列名,使用mapToHeader函数可以更容易地处理数据。

use Heller\SimpleCsv\Csv;

$csv = Csv::read('filepath.csv')
            ->mapToHeaders()
            ->toArray();

foreach($csv as $row){
    echo $row['columnname']; // instead of using $row[3]
}

跳过行 & 列

有时跳过某些行或列可能会有所帮助。你可以使用skipRowsskipColumns方法来实现。

$csv = Csv::read('filepath.csv')
           ->skipRows(1)
           ->skipColumns([2, 4, 'columnname'])
           ->toArray();

这两个方法都接受一个int来指定某个行/列,或者一个array来跳过多个行或列。`skipColumns`方法也接受列(头部)名称作为输入。

过滤

由于csv数据只是数组,我们可以当然按任何方式过滤数据。为了方便起见,我们还可以在收集数据时使用filter()回调来过滤。

$csv = Csv::read('filepath.csv')
           ->filter(fn($row) => $row['column'] != 'foo')
           ->toArray();

映射到对象

将行映射到对象允许你以更结构化的方式处理CSV数据。默认情况下,行被映射到stdClass,这允许使用对象属性访问CSV数据。

然而,如果你指定了一个自定义类,则每一行都将根据头部列名映射到该类。

// ...

$csv->mapToObject(); // Maps rows to stdClass

$csv->mapToObject(CsvRow::class)
    ->filter(function(CsvRow $item){
        return $item->isValid();
    })
    ->toArray();

当使用mapToObject方法时,列头会略微调整,以确保对象属性具有有效的名称。如果一个列头被命名为"Starts At",则名称将被规范化为"starts_at",以便可以用$row->starts_at访问。对于自定义类映射,(规范化后的)列头必须匹配类属性名称。

逐行处理

get方法始终会返回来自csv文件的行数组。可以是数组或对象。虽然这对于小型任务很有用,但内存效率不高,并且可能对大型csv文件造成问题。为了解决这个问题,你可以逐行处理并让包解决映射、过滤和跳过等问题。这使得处理包含数百万条记录的大型文件变得尽可能简单。

$csv->mapToObject(CsvRow::class)
    ->each(function(CsvRow $item) {
        // ... import the data or handle the data however you like
    });