luchaninov/csv-file-loader

加载CSV和TSV文件及字符串。使用生成器以最小化内存使用

1.9.1 2023-05-25 07:42 UTC

This package is auto-updated.

Last update: 2024-09-25 10:20:54 UTC


README

使用PHP生成器加载CSV和TSV文件及字符串。它像fopen一样使用内存,但代码更少。

如何安装

使用composer安装luchaninov/csv-file-loader

$ composer require luchaninov/csv-file-loader

基本用法

$loader = new CsvFileLoader('/path/to/your_data.csv');

foreach ($loader->getItems() as $item) {
    var_dump($item); // do something here
}

如果您有CSV文件

id,name,surname
1,Jack,Black
2,John,Doe

您将得到2个条目

['id' => '1', 'name' => 'Jack', 'surname' => 'Black']
['id' => '2', 'name' => 'John', 'surname' => 'Doe']

它使用fgetcsv函数,因此它可以理解包含的值,如

item1,"item2,still item2",item3

甚至

item1,"item2
still item2",item3

如果您有简单的字符串,无需将其保存到文件中。使用

(new CsvStringLoader($s))->getItemsArray();
(new TsvStringLoader($s))->getItemsArray();
(new AutoStringLoader($s))->getItemsArray();

高级用法

如果文件不大,您可以使用getItemsArray()一次性加载所有项目,而不使用生成器。

如果您有自定义的分隔符,请使用setDelimiter,如$loader->setDelimiter(';')。分隔符和括号的使用相同 - setEncloser。对于CsvFileLoader,默认分隔符是,,对于TsvFileLoader\t;默认括号是"。如果不确定,请使用分隔符auto,它会自动检测前10,000个字符中的分隔符。

如果您有TSV而不是CSV,您可以设置使用setDelimiter("\t")或使用TsvFileLoader。如果不确定,请使用AutoFileLoader,它会自动检测分隔符。

默认情况下,它假设文件的第一个包含标题 - 它不会将此行作为项目返回,而是将其用作下一行的键。如果第一行没有标题 - 您可以

  • 设置自己的键 - setHeaders(['key1', 'key2', ...])
  • 使用数字键 [0, 1, 2, ...] - setHeaders(false)

如果某些行中的列数多于标题中的列数,则它们将被截断。如果您更喜欢使用数字键添加额外值,请使用setAddUnknownColumns(true)

要计数项目,请使用countItems()。对于CSV,这通常不等于行数 - wc -l,因为一个项目可以有多个行。

您可以使用相同的加载器加载多个文件 - $loader->setFilename('other_file.csv')。如果在调用setFilename时迭代某些文件,则不会有来自第一个文件的项目,foreach将仅结束。

代码非常简单 - 请查看源代码和测试。

TxtFileLoader

如果您有简单的文本文件,请使用TxtFileLoader

它将文件转换为

text1
text2
text3

数组 ['text1', 'text2', 'text3']

setSkipEmptyRows

跳过空行或只包含空白字符的行 trim($s) === ''。默认: true

setSkipComments

跳过以#\s+#开头的行。默认: false