godsgood33/csv-reader

此库简化了CSV文件的读取

2.1 2023-07-14 22:11 UTC

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 对象返回或创建您自己的对象的方法。