读取csv时如何指定定界符?

时间:2019-04-16 07:48:10

标签: php csv

我正在尝试解析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

3 个答案:

答案 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;
}