heller / simple-csv
一个使处理CSV文件尽可能方便和简单的包
dev-main
2024-05-21 06:19 UTC
Requires (Dev)
- laravel/pint: ^1.13
- pestphp/pest: ^2.19
- rector/rector: ^0.18.5
- spatie/ray: ^1.39
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] }
跳过行 & 列
有时跳过某些行或列可能会有所帮助。你可以使用skipRows
和skipColumns
方法来实现。
$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 });