godsgood33 / csv-reader
此库简化了CSV文件的读取
Requires
- php: >=7.4
Requires (Dev)
- phpstan/phpstan: ^1.2
- phpunit/php-code-coverage: ^9.2
- phpunit/phpunit: ^9.4
This package is auto-updated.
Last update: 2024-09-15 03:19:00 UTC
README
简介
该库的目的是简化CSV文件的读取和解析。我解析CSV文件已经很多次了,并没有真正简单的方法来做这件事。你必须知道你想插入的列的索引,如果你可以使用标题本身作为字段索引会更容易阅读。一段时间前,我开始读取标题行,反转数组,使得行元素的索引现在是字段索引的值。
$header = array_flip(fgetcsv($fh)); /* array( 'column1' => 0, 'column2' => 1, 'column3' => 2, ... ) */
这允许你使用标题作为数据数组的索引。
foreach($data = fgetcsv($fh)) { // $data is now a numeric indexed array // $header['column1'] will return 0 so $data[$header['column1']] will return the value of the first index in the array to the CSV $column1 = $data[$header['column1']]; }
这很好,但并不比直接使用索引本身(或将索引存储在变量中并使用它)更容易阅读...
$column1 = $data[$column1HeaderIndex];
所以我想创建一个库,允许你使用标题作为字段名。下面是如何做到这一点的。
安装/设置
composer require godsgood33/csv-reader
Dev.to
我在Dev.to上做了更详细的解释
使用
将CSV文件名传递给类并创建一个对象
$reader = new Reader($csvFilename);
选项
这些选项作为关联数组在构造函数的第二个参数中可用
- delimiter - , (默认)
- 分隔字段字符
- enclosure - " (默认)
- 字段周围包围字符
- escape - \ (默认)
- 转义包围字符的字符
- header - 0 (默认)
- 标题标题行所在的行(基于0)
- alias - []
- 别名数组和它们指向的字段
- [ 'name' => 'Name', 'phone' => 'PhoneNumber', 'email' => 'Email' ]
- 别名数组和它们指向的字段
- required_headers - []
- 文件中必须存在的标题
- ['Name', 'PhoneNumber', 'Email']
- 文件中必须存在的标题
- headerCase - int
- 定义是否要更改标题字段的大小写
Header::TO_LOWER
- 将所有字符设置为小写(例如'phonenumber')Header::TO_CAMEL_CASE
- 设置第一个字符为小写,其他单词的第一个字符为大写(例如'phoneNumber')
- 定义是否要更改标题字段的大小写
// sets the column delimiter to the semi-colon, the header column is now the second row and changes the header properties to all the lower case $reader = new Reader($csvFilename, [ 'delimiter' => ';', 'enclosure' => "'", 'header' => 1, 'headerCase' => Header::TO_LOWER, ]);
Reader将删除任何非字母数字字符 [^a-zA-Z0-9_]
。
完成此操作后,你需要开始循环,直到文件末尾或找到所需的数据。
注意:Reader在解析完成后将自动读取标题后的第一行,因此请不要使用 while
循环
在循环内部,您可以使用标题作为字段名来检索每个列的数据
do { $name = $reader->name; $phone = $reader->phone; $email = $reader->email; } while($reader->next());
必需标题
如果您必须指定文件中的必需标题,您可以在实例化时通过' required_headers'选项指定它们。
// this will first check that the 'name', 'phone', and 'email' columns are present before proceeding...throws a "InvalidHeaderOrField" exception is something is missing $reader = new Reader('file.csv', ['required_headers' => [ 'name', 'phone', 'email' ]]);
别名
如果您想指定一个字段具有别名,您可以使用带有'alias'关联数组选项指定。键参数是别名,值是它指向的字段。
$reader = new Reader('file.csv', [ 'alias' => [ 'digits' => 'phone', 'zip' => 'postalcode' ] ] );
以上说明允许您使用以下任一项:
$phone = $reader->digits; $phone = $reader->phone;
地图
在 CSVReader
中,地图是一种读取多个字段并同时将它们以格式化字符串返回的方法。
过滤器
当解析文件时,过滤器可以是一个非常有用的选项。它们可以在将字段值导入系统之前进行验证,用于操作数据,删除或添加字符,添加其他数据以便更好地在数据库或HTML中使用,或从字段值创建对象。过滤器可以与别名一起使用,但您必须在文件中的字段上执行过滤器,而不是别名。在上面的示例中,过滤器必须分配给 phone
字段,而不是 digits
。过滤器不与地图一起使用,因为那些已经包含自己的回调,因此可以在 Map
回调中完成过滤器功能。
链接
链接是一种可以同时检索多个字段并将它们作为 stdClass
对象返回或创建您自己的对象的方法。