Wilgucki/ csv
Laravel 5 包用于读写 CSV 文件
Requires
- php: >=7.0
- wilgucki/php-csv: ^1.0
Requires (Dev)
- phpunit/phpunit: ^7.1
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 文件添加数据,您可以使用 writeLine
或 writeAll
方法。
$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
待办事项
- 处理关系