wilgucki/php-csv

面向对象管理CSV文件的方法

v1.1.1 2019-05-12 09:20 UTC

This package is auto-updated.

Last update: 2024-09-04 17:25:55 UTC


README

PHP-CSV是一个允许以面向对象的方式管理CSV文件的包。

安装

无需做太多,只需运行以下composer命令

composer require wilgucki/php-csv

使用方法

Reader和Writer类都很容易使用。实际上,这些类只是内置PHP函数的封装。

Reader

Reader类可以帮助您读取现有的CSV文件(这里没有惊喜)。

要读取CSV文件,您首先需要打开它。

$reader = new Reader();
$reader->open('/path/to/file.csv');

构造函数接受可选参数,您可以使用这些参数来描述您的CSV文件。这些参数包括

  • $delimiter
  • $enclosure
  • $escape
  • $encodingFrom
  • $encodingTo

前三个参数与手册中描述的fgetcsv函数的参数完全相同 - https://php.ac.cn/manual/en/function.fgetcsv.php

其他两个参数有助于您定义编码 - $encodingFrom 是CSV文件的编码,而 $encodingTo 是读取文件后得到的编码。

要从CSV文件中读取数据,我们可以使用两个函数: readLinereadAll。前者将读取并返回当前行,而后者将读取整个CSV文件并返回一个数组数组(每行将表示为一个数组)。

如果CSV文件有一个标题行,您可以使用 getHeader 函数。此函数将使用CSV文件的第一行并将其用作 readLinereadAll 函数的数组键。这意味着您可以使用第一行中定义的标签而不是数字键。

转换器

有时CSV文件中的数据需要转换为更合适的格式,例如将日期转换为Carbon对象。转换器使这项任务变得容易得多。您只需创建转换器对象并指定要转换的列。

$reader = new Reader();
$reader->open('/path/to/file.csv');
$reader->addConverter(3, new DateToCarbon());
$data = $reader->readLine();

每个列只能分配一个转换器。

示例

CSV文件示例

user_id,name
1,john
2,jane
$reader = new Reader();
$reader->open('/path/to/file.csv');
print_r($reader->readLine());
/*
Array
(
    [0] => user_id
    [1] => name
)
*/
print_r($reader->readLine());
/*
Array
(
    [0] => 1
    [1] => john
)
*/
$reader = new Reader();
$reader->open('/path/to/file.csv');
print_r($reader->readAll());
/*
Array
(
    [0] => Array
        (
            [0] => user_id
            [1] => name
        )

    [1] => Array
        (
            [0] => 1
            [1] => john
        )

    [2] => Array
        (
            [0] => 2
            [1] => jane
        )

)
*/
$reader = new Reader();
$reader->open('/path/to/file.csv');
print_r($reader->getHeader());
/*
Array
(
    [0] => user_id
    [1] => name
)
*/
$reader = new Reader();
$reader->open('/path/to/file.csv');
$reader->getHeader();
print_r($reader->readLine());
/*
Array
(
    [user_id] => 1
    [name] => john
)
*/
$reader = new Reader();
$reader->open('/path/to/file.csv');
$reader->getHeader();
print_r($reader->readAll());
/*
Array
(
    [0] => Array
        (
            [user_id] => 1
            [name] => john
        )

    [1] => Array
        (
            [user_id] => 2
            [name] => jane
        )

)
*/

完成工作后,别忘了关闭CSV文件。

$reader->close();

Writer

要创建/更新CSV文件,您可以使用Writer类。如果您想创建文件,则需要提供可写路径。要更新现有文件,您必须使用可选的 $mode 参数。所有可用模式都在手册中有描述(https://secure.php.net/manual/en/function.fopen.php),但只有 'w' 和 'a' 值在这种情况下可使用。

$writer = new Writer();

// create new file
$writer->create('/path/to/file.csv');

// update existing file
$writer->create('/path/to/file.csv', 'a+');

Writer 构造函数接受与 Reader 构造函数相同的参数。唯一的区别是 $encodingFrom 指的是输入编码,而 $encodingTo 指的是CSV文件的编码。

有两种方法可以写入CSV文件 - writeLinewriteAll。第一种方法将单行写入CSV文件,而第二种方法将多行写入。如果出于某种原因需要访问写入CSV文件中的数据,可以使用 flush 方法。

示例

// write a single line to the CSV file

$writer = new Writer();
$writer->create('/path/to/file.csv');
$writer->writeLine(['abc', 'def']);
// write multiple lines to the CSV file

$writer = new Writer();
$writer->create('/path/to/file.csv');
$writer->writeAll([
    ['abc', 'def'],
    [123, 234]
]);
// display added data

$writer = new Writer();
$writer->create('/path/to/file.csv');
$writer->writeAll([
    ['abc', 'def'],
    [123, 234]
]);
echo $writer->flush();
/*
abc,def
123,234
*/

完成工作后,别忘了关闭CSV文件。

$writer->close();

待办事项

  • 处理器 - 处理CSV数据并返回结果