htmlburger / carbon-csv
简单的CSV文件解析器
Requires
- php: ^5.4.0 || ^7.0
Requires (Dev)
- illuminate/support: ^5.4
- phpunit/phpunit: ^6.1
- symfony/var-dumper: ^3.3
This package is auto-updated.
Last update: 2024-09-08 14:47:59 UTC
README
Carbon CSV是一个旨在简化CSV解析的PHP库。
它提供了一个简单的接口,通过标题行或自定义列名来简化列的映射。
安装
composer require htmlburger/carbon-csv
用法
假设您有以下CSV文件
以下是如何遍历行的方式
use \Carbon_CSV\CsvFile; use \Carbon_CSV\Exception as CsvException; try { $csv = new CsvFile('path-to-file/filename.csv'); $csv->use_first_row_as_header(); foreach ($csv as $row) { print_r($row); } } catch (CsvException $e) { exit("Couldn't parse CSV file: " . $e->getMessage()); }
这将产生以下输出
Array
(
[First Name] => Homer
[Last Name] => Simpson
[Company Name] => Springfield Nuclear Power Plant
[Address] => 742 Evergreen Terrace, Springfield
)
Array
(
[First Name] => Ned
[Last Name] => Flanders
[Company Name] => The Leftorium
[Address] => 744 Evergreen Terrace, Springfield
)
或者,您也可以提供自己的列名
use \Carbon_CSV\CsvFile; use \Carbon_CSV\Exception as CsvException; try { $csv = new CsvFile('path-to-file/filename.csv'); $csv->use_first_row_as_header(); $csv->set_column_names([ 'First Name' => 'fname', 'Last Name' => 'lname', 'Company Name' => 'company', 'Address' => 'address', ]); foreach ($csv as $row) { print_r($row); } } catch (CsvException $e) { exit("Couldn't parse CSV file: " . $e->getMessage()); }
这将产生以下输出
Array
(
[fname] => Homer
[lname] => Simpson
[company] => Springfield Nuclear Power Plant
[address] => 742 Evergreen Terrace, Springfield
)
Array
(
[fname] => Ned
[lname] => Flanders
[company] => The Leftorium
[address] => 744 Evergreen Terrace, Springfield
)
MacOS编码
当与Mac设备创建的文件一起工作时,应将PHP变量auto_detect_line_endings
设置为1
。
ini_set( 'auto_detect_line_endings', 1 );
设置
要更改CSV文件的分隔符、定界符和转义字符,只需在文件路径后传递它们作为参数即可。
示例
use \Carbon_CSV\CsvFile as CsvFile; use \Carbon_CSV\Exception; $csv = new CsvFile('path-to-file/filename.csv', ';', '|', '/'); $rows = $csv->to_array();
方法
跳过行或列的方法使用零基索引。
skip_to_row(int $row_index)
要跳转到特定行,只需传递行的索引。
这将告诉解析器从该行开始读取,直到文件末尾。
use \Carbon_CSV\CsvFile as CsvFile; use \Carbon_CSV\Exception; $csv = new CsvFile('path-to-file/filename.csv'); $csv->skip_to_row(1); $rows = $csv->to_array();
跳转到特定行之前的文件内容
Array
(
[0] => Array
(
[0] => John
[1] => Doe
[2] => Simple Company Name
[3] => Street Name, 1234, City Name, Country Name
)
[1] => Array
(
[0] => Jane
[1] => Doe
[2] => Nice Company Name
[3] => Street Name, 5678, City Name, Country Name
)
)
跳转到特定行之后的文件内容
Array
(
[0] => Array
(
[0] => Jane
[1] => Doe
[2] => Nice Company Name
[3] => Street Name, 5678, City Name, Country Name
)
)
skip_to_column(int $col_index)
要跳转到特定列,只需传递列的索引。
use \Carbon_CSV\CsvFile as CsvFile; use \Carbon_CSV\Exception; $csv = new CsvFile('path-to-file/filename.csv'); $csv->skip_to_column(2); $rows = $csv->to_array();
跳转到特定列之前的文件内容
Array
(
[0] => Array
(
[0] => John
[1] => Doe
[2] => Simple Company Name
[3] => Street Name, 1234, City Name, Country Name
)
[1] => Array
(
[0] => Jane
[1] => Doe
[2] => Nice Company Name
[3] => Street Name, 5678, City Name, Country Name
)
)
跳转到特定列之后的文件内容
Array
(
[0] => Array
(
[0] => Simple Company Name
[1] => Street Name, 1234, City Name, Country Name
)
[1] => Array
(
[0] => Nice Company Name
[1] => Street Name, 5678, City Name, Country Name
)
)
skip_columns(array $col_indexes)
要跳过多个列,请传递这些列的索引数组。
use \Carbon_CSV\CsvFile as CsvFile; use \Carbon_CSV\Exception; $csv = new CsvFile('path-to-file/filename.csv'); $csv->skip_columns(array(0, 2, 3)); $rows = $csv->to_array();
跳过列之前的文件内容
Array
(
[0] => Array
(
[0] => John
[1] => Doe
[2] => Simple Company Name
[3] => Street Name, 1234, City Name, Country Name
)
[1] => Array
(
[0] => Jane
[1] => Doe
[2] => Nice Company Name
[3] => Street Name, 5678, City Name, Country Name
)
)
跳过列之后的文件内容
Array
(
[0] => Array
(
[0] => Doe
)
[1] => Array
(
[0] => Doe
)
)
use_first_row_as_header()
要使用CSV的第一行,只需调用此方法。
注意:如果先调用skip_to_row
,然后再调用use_first_row_as_header
,解析器将使用新的第一行作为标题。
use \Carbon_CSV\CsvFile as CsvFile; use \Carbon_CSV\Exception; $csv = new CsvFile('path-to-file/filename.csv'); $csv->use_first_row_as_header(); $rows = $csv->to_array();
分配标题行之前的文件内容
Array
(
[0] => Array
(
[0] => First Name
[1] => Last Name
)
[1] => Array
(
[0] => John
[1] => Doe
)
[2] => Array
(
[0] => Jane
[1] => Dove
)
)
分配标题行之后的文件内容
Array
(
[0] => Array
(
[First Name] => John
[Last Name] => Doe
)
[1] => Array
(
[First Name] => Jane
[Last Name] => Dove
)
)
由于我们告诉解析器使用第一行作为标题行,因此它被分配并跳过。
set_column_names(array $columns_mapping)
如果您希望为列使用自己的索引,请使用数组传递它们。
注意:您可以将set_column_names
与use_first_row_as_header
一起使用,这样您就可以根据标题行设置列的名称。
没有使用use_first_row_as_header
的示例(使用没有标题行的文件)
use \Carbon_CSV\CsvFile as CsvFile; use \Carbon_CSV\Exception; $csv = new CsvFile('path-to-file/filename-no-head-rows.csv'); $csv->set_column_names([ 0 => 'first_name', 1 => 'last_name', 2 => 'company_name', 3 => 'address', ]); $rows = $csv->to_array();
设置自定义列名之前的文件内容
Array
(
[0] => Array
(
[0] => John
[1] => Doe
[2] => Simple Company Name
[3] => Street Name, 1234, City Name, Country Name
)
[1] => Array
(
[0] => Jane
[1] => Doe
[2] => Nice Company Name
[3] => Street Name, 5678, City Name, Country Name
)
)
设置自定义列名之后的文件内容
Array
(
[0] => Array
(
[first_name] => John
[last_name] => Doe
[company_name] => Simple Company Name
[address] => Street Name, 1234, City Name, Country Name
)
[1] => Array
(
[first_name] => Jane
[last_name] => Doe
[company_name] => Nice Company Name
[address] => Street Name, 5678, City Name, Country Name
)
)
使用use_first_row_as_header
的示例(使用有标题行的文件)
use \Carbon_CSV\CsvFile as CsvFile; use \Carbon_CSV\Exception; $csv = new CsvFile('path-to-file/filename-no-head-rows.csv'); $csv->use_first_row_as_header(); $csv->set_column_names([ 'First Name' => 'first_name', 'Last Name' => 'last_name', 'Company Name' => 'company_name', 'Address' => 'address', ]); $rows = $csv->to_array();
设置自定义列名之前的文件内容
Array
(
[0] => Array
(
[0] => First Name
[1] => Last Name
[2] => Company Name
[3] => Address
)
[1] => Array
(
[0] => John
[1] => Doe
[2] => Simple Company Name
[3] => Street Name, 1234, City Name, Country Name
)
[2] => Array
(
[0] => Jane
[1] => Doe
[2] => Nice Company Name
[3] => Street Name, 5678, City Name, Country Name
)
)
设置自定义列名之后的文件内容
Array
(
[0] => Array
(
[first_name] => John
[last_name] => Doe
[company_name] => Simple Company Name
[address] => Street Name, 1234, City Name, Country Name
)
[1] => Array
(
[first_name] => Jane
[last_name] => Doe
[company_name] => Nice Company Name
[address] => Street Name, 5678, City Name, Country Name
)
)
set_encoding($encoding)
设置CSV文件的编码。这是必要的,以便可以正确转换为utf-8
示例
use \Carbon_CSV\CsvFile as CsvFile; use \Carbon_CSV\Exception; $csv = new CsvFile('path-to-file/filename.csv'); $csv->set_encoding('windows-1251'); $total_number_of_rows = $csv->count();
count()
获取CSV文件中的总行数(跳过空行)
use \Carbon_CSV\CsvFile as CsvFile; use \Carbon_CSV\Exception; $csv = new CsvFile('path-to-file/filename.csv'); $total_number_of_rows = $csv->count();
$total_number_of_rows = $csv->count()
与count($csv->to_array())
等效。