一般处理csv内容时,php多用explode(“,”, $csvLine),但是有些csv单元格内有多余的英文逗号,如下面的从腾讯云日志里导出的nginx日志。
remote_addr,request_body,request_method,request_time
10.0.0.35,"{\x22logDatas\x22:\x22[{\x5C\x22orderId\x5C\x22:\x5C\x2220731922\x5C\x22,\x5C\x22oldDeductTime\x5C\x22:\x5C\x22\x5C\x22,\x5C\x22oldExpressTime\x5C\x22:\x5C\x22\x5C\x22,\x5C\x22operType\x5C\x22:\x5C\x223\x5C\x22}]\x22,\x22sourceTag\x22:\x22erp\x22}",POST,5.063,
request_body 这一列里的内容比较复杂有多余逗号,直接用,分隔,处理后的内容就会和我们预想的结果不一样,如何处理呢,或者wps这种软件是如何正确识别的呢,仔细观察发现,这种特殊的单元格内容使用双引号包裹的,所以就是分隔单元格时,要排除双引号包裹的逗号,代码如下
$content = file_get_contents(__DIR__ . '/export-85867e21-492e-4c2a-a656-2f52b91575a3.csv');
$list = explode("\n", $content);
array_shift($list);
foreach ($list as $item) {
// 主要是这样代码
$itemList = preg_split('/,(?=(?:(?:[^"]*"){2})*[^"]*$)/', $item);
var_dump($itemList);
exit;
}