读取和写入 CSV 文件

v1.0.2 2020-06-25 10:24 UTC

This package is auto-updated.

Last update: 2024-09-11 00:01:56 UTC


README

一个包含管理读取和写入 CSV 文件类别的包。

安装

使用 composer 将其添加到您的项目中

composer require talkingbit/csv

基本用法

Reader

Reader 允许我们读取文件系统中指定文件的內容。內容通过生成器返回。典型用法如下。行将以纯数组的形式读取。

use TalkingBit\Csv\Reader\Reader;

$reader = new Reader();
$filePath = '/path/to/file.csv';
$rows = $reader
    ->fromFile($filePath)
    ->readAll();

foreach ($rows as $row) {
    // Do whatever you need
}

如果文件有 CSV 头部,可以使用以下设置,这样行将以关联数组的形式读取

use TalkingBit\Csv\Reader\Reader;

$reader = new Reader();
$filePath = '/path/to/file.csv';
$rows = $reader
    ->fromFile($filePath)
    ->withHeaders()
    ->readAll();

foreach ($rows as $row) {
    // Do whatever you need
}

此外,您可以将行映射到一个简单的 Dto,前提是所有相关字段都是公共的

use TalkingBit\Csv\Reader\Reader;
use TalkingBit\Csv\Reader\Mapper\DtoMapper;

$reader = new Reader();
$filePath = '/path/to/file.csv';
$rows = $reader
    ->fromFile($filePath)
    ->withHeaders()
    ->usingMapper(new DtoMapper(MyDto::class))
    ->readAll();

foreach ($rows as $row) {
    // Do whatever you need
}

Writer

Writer 允许我们将数据写入 CSV 文件。

一行可以是一个纯数组

use TalkingBit\Csv\Writer\Writer;

$writer = new Writer();
$writer
    ->toFile('/path/to/file.csv')
    ->writeRow([123, 'My name']);

一行可以是一个关联数组。在这种情况下,键将用作 CSV 头部。

use TalkingBit\Csv\Writer\Writer;

$writer = new Writer();
$writer
    ->toFile('/path/to/file.csv')
    ->writeRow(['id' => 123, 'name' => 'My name']);

此外,您可以直接将 Dto 写入 CSV 文件。Dto 将被视为关联数组。

use TalkingBit\Csv\Writer\Writer;

$writer = new Writer();

$dto = new MyDto();
$dto->id = 123;
$dto->name = 'My name';

$writer
    ->toFile('/path/to/file.csv')
    ->writeRow($dto);

配置

您可以自定义分隔符和封装字符

$writer
    ->toFile('/path/to/file.csv')
    ->withDelimiter(',')
    ->withEnclosure('"')
    ->writeRow($dto);

为 Reader 定制映射器

您可以创建实现以下接口的定制映射器

interface RowMapperInterface
{
    public function map(array $line, ?array $headers = null);
}

$line 参数包含文件中的行数据。如果找到,则 $headers 包含 CSV 头部。您可以返回任何类型,因此您可以自由地执行如下操作

  • 构建应用程序对象。
  • 使用输入数据进行计算。
  • 验证输入数据。

贡献

请随意打开问题或拉取请求。