Cha*_*one 6 php csv string parsing
我需要解析 CSV 字符串,第一步,我想从中获取行。我使用str_getcsv函数来执行此操作,但即使在最基本的情况下(用引号引起来的新行),它似乎也会失败。
$rows = '7;"Hi
";3';
$array = str_getcsv($rows,"\n",'"');
print_r($array);
Run Code Online (Sandbox Code Playgroud)
结果应该是只有一个值的数组,但我得到了两个 - 令人惊讶的是引用的新行在哪里......
result:
Array
(
[0] => 7;"Hi
[1] => ;3
)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
编辑:很奇怪,但是当我尝试时
$rows = '7;"Hi
";3
8;Hello;6';
Run Code Online (Sandbox Code Playgroud)
结果是
Array
(
[0] => 7;"Hi
[1] => ;3
8;Hello;6
)
Run Code Online (Sandbox Code Playgroud)
似乎str_getcsv()不允许在字符串字段中包含换行符,并通过换行符解析行而不检查新行是否在字段中。有必要使用与此功能不同的东西,它只是不能很好地工作。
我找到了直接解析 CSV 的代码,无需将其解析为user 函数手册页中的行。所缺少的是它不使用第一行中的值作为其他行的键。str_getcsv()normadize -a- gmail -d- com
function parse_csv ($csv_string, $delimiter = ",", $skip_empty_lines = true, $trim_fields = true)
{
$enc = preg_replace('/(?<!")""/', '!!Q!!', $csv_string);
$enc = preg_replace_callback(
'/"(.*?)"/s',
function ($field) {
return urlencode(utf8_encode($field[1]));
},
$enc
);
$lines = preg_split($skip_empty_lines ? ($trim_fields ? '/( *\R)+/s' : '/\R+/s') : '/\R/s', $enc);
return array_map(
function ($line) use ($delimiter, $trim_fields) {
$fields = $trim_fields ? array_map('trim', explode($delimiter, $line)) : explode($delimiter, $line);
return array_map(
function ($field) {
return str_replace('!!Q!!', '"', utf8_decode(urldecode($field)));
},
$fields
);
},
$lines
);
}
?>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4387 次 |
| 最近记录: |