CSV 读取器和写入器

v3.0.0 2021-08-21 12:59 UTC

README

License Build Status Code Quality Code Coverage

PHP的CSV读取器和写入器。

Reader类实现了Iterator接口,每次将一行加载到内存中。这意味着大型文件可以解析而不会遇到任何内存限制。

要求

  • PHP >= 7.4

安装

使用composer将包添加到您的依赖项

composer require palmtree/csv

用法

读取

从CSV文件中读取

$csv = new Reader('people.csv');

foreach($csv as $row) {
    $name = $row['name'];
    if (isset($row['age'])) {
        echo "age is set!";
    }
}

规范化数据类型

可以使用多个不同类型的规范化器将数据从字符串转换为特定的数据类型。以下是一些当前捆绑的规范化器的示例

$csv = new Reader('/path/to/products.csv');

$csv->addNormalizers([
    // Convert to integer
    'product_id' => new NumberNormalizer(),

    // Keep data as string but trim it
    'name' => new StringNormalizer(),

    // Convert to float, rounded to 4 decimal places
    'price' => NumberNormalizer::create()->scale(4),

    // Convert to boolean true or false
    'enabled' => new BooleanNormalizer(),

    // Convert to an array of integers
    'related_product_ids' => new ArrayNormalizer(new NumberNormalizer()),

    // Custom conversion with a callback
    'specials' => new CallableNormalizer(fn ($value) => json_decode($value)),
]);

无标题

如果您的CSV没有标题,请在构造函数的第二个参数中传递false

$csv = new Reader('people.csv', false);

// Alternatively, call the setHasHeaders() method after instantiation:
//$csv->setHasHeaders(false);

标题偏移量

如果您的CSV标题不在第一行,您可以指定(基于零)行偏移量

$csv = new Reader('people.csv');
// Headers are on the second row so let's set the offset to 1
$csv->setHeaderOffset(1);

内联读取

如果CSV字符串是通过API调用或其他方式获得的,您可以使用InlineReader来解析CSV字符串而不是文件

$csv = new \Palmtree\Csv\InlineReader('"header_1","header_2"' . "\r\n" . '"foo","bar"');

写入

构建和下载CSV文件

$people   = [];
$people[] = [
    'name'   => 'Alice',
    'age'    => '24',
    'gender' => 'Female',
];
$people[] = [
    'name'   => 'Bob',
    'age'    => '28',
    'gender' => 'Male',
];

Downloader::download('filename.csv', $people);

将数据写入CSV文件

$people   = [];
$people[] = [
    'name'   => 'Alice',
    'age'    => '24',
    'gender' => 'Female',
];
$people[] = [
    'name'   => 'Bob',
    'age'    => '28',
    'gender' => 'Male',
];


Writer::write('/path/to/output.csv', $people);

有关更多用法示例,请参阅示例目录

高级用法

CSV控制

您可以通过访问文档对象来更改CSV分隔符、封装符和转义字符

$csv = new Reader('/path/to/input.csv');

$csv->setDelimiter("\t");
$csv->setEnclosure('"');
$csv->setEscapeCharacter("\\");

行结束符

CSV默认使用\r\n行结束符。如果您需要更改此设置,请访问文档对象

$csv = new Writer('/path/to/output.csv');
$csv->getDocument()->setLineEnding("\n");

细粒度控制

文档对象扩展了PHP的SplFileObject并继承了其方法

$csv = new Reader('/path/to/input.csv');
$csv->getDocument()->setFlags(\SplFileObject::DROP_NEW_LINE);

配置

如果您正在尝试读取或生成旧Mac计算机上的CSV文件,您可能需要在创建新的Reader实例之前包含以下片段

if (!ini_get('auto_detect_line_endings')) {
    ini_set('auto_detect_line_endings', '1');
}

这是因为Mac曾经使用\r作为行分隔符。有关更多详细信息,请参阅此处

许可证

MIT许可证下发布