Wilgucki/csv

Laravel 5 包用于读写 CSV 文件

1.0 2018-07-15 11:27 UTC

This package is auto-updated.

Last update: 2024-09-11 14:24:05 UTC


README

Laravel 5 包,用于读取和写入 CSV 文件。

警告

该包已更新到 PHP 7。如果您无法更新到 PHP 7,请使用 0.6.x 版本。

安装

使用 composer 安装包

composer require wilgucki/csv

对于使用 Laravel 5.5+ 构建的项目,您可以跳过下一步。该包使用包发现功能,因此您无需修改配置文件。对于旧版本的 Laravel,您需要在 config/app.php 文件中添加服务提供者和别名。

'providers' => [
    //... 
    Wilgucki\Csv\CsvServiceProvider::class,
]

// ...

'aliases' => [
    //...
    'CsvReader' => Wilgucki\Csv\Facades\Reader::class,
    'CsvWriter' => Wilgucki\Csv\Facades\Writer::class,
]

最后一步是发布包配置

php artisan vendor:publish --provider="Wilgucki\Csv\CsvServiceProvider"

用法

配置文件

包配置可以在配置目录下的 csv.php 文件中找到(发布后)。该文件包含分隔符、封装和转义参数的默认值。您可以在其中设置默认值,并在打开和创建方法中跳过传递额外的参数(我们稍后讨论这些参数)。

转换编码

处理 Excel 生成的 CSV 文件时常见的问题是编码。Excel 以 windows-1250 字符集编码导出 CSV 文件,而大多数 PHP 应用程序使用 UTF-8。为了解决这个问题,您可以在配置文件中设置编码选项。您可以为读取器和写入器分别设置编码偏好。

'encoding' => [
    'reader' => [
        'enabled' => true,
        'from' => 'CP1250',
        'to' => 'UTF-8'
    ],
    'writer' => [
        'enabled' => true,
        'from' => 'UTF-8',
        'to' => 'CP1250'
    ]
]

如上例所示,读取器将 windows-1250 编码转换为 UTF-8,而写入器将执行相反的操作。您不需要使用这两个选项。您可以为读取器或写入器中的一个类设置编码转换。

读取器

从打开 CSV 文件开始。

$reader = CsvReader::open('/path/to/file.csv');

如果您需要更改分隔符、封装或转义,您可以通过传递适当的值到 open 方法来实现。有关这些值的更多信息,请参阅此处 - https://php.ac.cn/manual/en/function.fgetcsv.php

$reader = CsvReader::open('/path/to/file.csv', ';', '\'', '\\\\');

在打开 CSV 文件后,您可以逐行读取它

while (($line = $reader->readLine()) !== false) {
    print_r($line);
}

或者您可以一次读取整个文件

print_r($reader->readAll());

如果您的 CSV 文件包含标题行,您可以将其转换为每行的数组键。

$reader = CsvReader::open($file, ';');
$header = $reader->getHeader();
print_r($header);
print_r($reader->readAll());

完成工作后,不要忘记关闭文件。

$reader->close();

写入器

创建新的 CSV 文件

$writer = CsvWriter::create('/path/where/your/file/will/be/saved.csv');

文件路径是可选的。如果您不提供它,CsvWriter 将使用内存作为存储。

如果您需要更改分隔符、封装或转义,您可以通过传递适当的值到 create 方法来实现。有关这些值的更多信息,请参阅此处 - https://php.ac.cn/manual/en/function.fputcsv.php

$writer = CsvWriter::create('/path/to/file.csv', ';', '\'', '\\\\');

要向 CSV 文件添加数据,您可以使用 writeLinewriteAll 方法。

$writer->writeLine(['some', 'data']);
$writer->writeLine(['another', 'line']);

$writer->writeAll([
    ['some', 'data'],
    ['another', 'line'],
]);

要显示添加到 CSV 文件中的数据,请使用 flush 方法。

echo $writer->flush();

完成工作后,不要忘记关闭文件。

$writer->close();

与 Eloquent 模型集成

如果您想/需要将 CsvReader 和/或 CsvWriter 与 Eloquent 模型集成,有一种简单的方法可以实现。Csv 包提供了三个特质以简化此过程。

这些特质尚未测试用于处理关系。关系仍在待办事项列表中

CsvCustomCollection

将 CsvCustomCollection 特质添加到模型类中,使 toCsv 方法可用于集合。

use Wilgucki\Csv\Traits\CsvCustomCollection;

class SomeModel extends Model
{
    use CsvCustomCollection;
    
    //...
}

$items = SomeModel::all();
$csvData = $items->toCsv();

CsvExportable

CsvExportable 特质允许您将单个模型对象转换为 CSV 数据。

use Wilgucki\Csv\Traits\CsvExportable;

class SomeModel extends Model
{
    use CsvExportable;
    
    //...
}

$csvData = SomeModel::find(1)->toCsv();

CsvImportable

CsvImportable 特性允许您从 CSV 文件导入数据并将其保存到数据库中。导入的文件必须包含标题行,其中包含的列名与数据库表中列名一致。主键必须命名为 id。CSV 导入器将更新所有匹配的行,并添加表中找不到的每一行。

CSV 文件中的每一列都将与 $fillable 数组进行比较,只插入或更新其中存在的列。

use Wilgucki\Csv\Traits\CsvImportable;

class SomeModel extends Model
{
    use CsvImportable;
    
    //...
}

SomeModel::fromCsv('/path/to/file.csv');

命令行

csv:import

要导入 CSV 文件到数据库表,请使用 csv:import 命令。

php artisan csv:import 模型 csv文件

  • 模型 - 带其命名空间的模型类名
  • csv文件 - 相对于项目根目录的文件名和路径

如果您想导入用户,可以使用以下命令(请记住使用正确的 CSV 文件路径)

php artisan csv:import "App\User" storage/users.csv

csv:export

此命令允许您将数据库表中的数据导出到 CSV 文件。

php artisan csv:export 模型 csv文件

  • 模型 - 带其命名空间的模型类名
  • csv文件 - 相对于项目根目录的文件名和路径

如果您想导出用户,可以使用以下命令(请记住使用正确的 CSV 文件路径)

php artisan csv:export "App\User" storage/users.csv

待办事项

  • 处理关系