luchaninov / csv-file-loader
加载CSV和TSV文件及字符串。使用生成器以最小化内存使用
Requires
- php: >=8.1
- ext-mbstring: *
Requires (Dev)
- phpunit/phpunit: ^9.5
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。