我正在尝试解析csv文件。当有定界符“,”时,一切都很好。但是在原始文件中是定界符“;”而且出现错误“未定义的偏移量”
这是我的工作代码,
$CSV = '"id","email",name,google.com,google.com
1,email1@email.com,jack,,+
2,email2@email.com,jack,+,
3,email3@email.com,jack,,';
http://sandbox.onlinephpfunctions.com/code/b507a90106e22fcba80b9797f5fe704df89db2d1
这不起作用:
<?php
$CSV = '"id";"email";name;google.com;google.com
1;email1@email.com;jack;;+
2;email2@email.com;jack;+;
3;email3@email.com;jack;;';
$lines = explode(PHP_EOL, $CSV);
$csv = array_map('str_getcsv', $lines);
$index = count($csv);
while($index) {
$columnName = $csv[0][$index];
$columnNameCount = array_count_values($csv[0])[$columnName];
$csv[0][$index] = $columnNameCount > 1 ? $csv[0][$index] . "({$columnNameCount})" : $csv[0][$index];
$index--;
}
array_walk($csv, function (&$a) use ($csv) {
$a = array_combine($csv[0], $a);
});
array_shift($csv);
$select = array_filter($csv, function ($line) {
return $line['google.com'] == '+';
});
$merges = array_merge($csv, $select);
foreach ($merges as $merge) {
print_r($merge);
}
http://sandbox.onlinephpfunctions.com/code/3a53bd392f9e01de40ae4b1cb8b1edde30569bff
答案 0 :(得分:1)
$csv = array_map('str_getcsv', $lines);
此处不会通过此调用将任何额外的参数传递到str_getcsv
中,因此它将对所有参数使用默认值。
一个小的匿名函数,可以在内部使用自己想要的额外参数调用str_getcsv
$csv = array_map(function($l) { return str_getcsv($l, ';'); }, $lines);
答案 1 :(得分:0)
在
$csv = array_map('str_getcsv', $lines);
您将str_getcsv
与 default 参数一起应用,默认情况下,第二个参数为,
。要使用;
,您应该对其进行显式设置,例如:
$csv = array_map(function($v) { return str_getcsv($v, ';'); }, $lines);
答案 2 :(得分:0)
https://www.php.net/manual/en/function.str-getcsv.php上有很多示例 例如:
function csv_to_array($string='', $row_delimiter=PHP_EOL, $delimiter = "," , $enclosure = '"' , $escape = "\\" )
{
$rows = array_filter(explode($row_delimiter, $string));
$header = NULL;
$data = array();
foreach($rows as $row)
{
$row = str_getcsv ($row, $delimiter, $enclosure , $escape);
if(!$header)
$header = $row;
else
$data[] = array_combine($header, $row);
}
return $data;
}