Php 如何在读取csv时指定分隔符?

Php 如何在读取csv时指定分隔符?,php,csv,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,,'; 这是行不通的: <?php $CSV = '"id";"email";name;googl

我正在尝试解析csv文件。当有分隔符“,”时,一切正常。但在原始文件中是分隔符“;”和我得到的错误“未定义的偏移量”

这是我的工作代码:

$CSV = '"id","email",name,google.com,google.com
1,email1@email.com,jack,,+
2,email2@email.com,jack,+,
3,email3@email.com,jack,,';

这是行不通的:

<?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);
}
中的

使用
str\u getcsv
default参数应用,默认情况下第二个参数是
。使用
您应该显式设置它,例如:

$csv = array_map(function($v) { return str_getcsv($v, ';'); }, $lines);

这方面有很多例子 例:

这里的调用不会将任何额外参数传递到
str_getcsv
,因此它将使用所有参数的默认值

一个小的匿名函数调用
str_getcsv
inside,其中包含您想要的额外参数

$csv = array_map(function($l) { return str_getcsv($l, ';'); }, $lines);

尝试解析csv是本机PHP,并接受不同的分隔符。非常感谢,您能告诉我,如果我在csv文件中添加更多行,为什么会出错吗?如果我删除了一半的数据,一切都会好起来。也许你可以修复我的错误,让我的脚本正常工作?请注意请注意:(我甚至还不知道你到底想用这个脚本实现什么……你有一个$csv的二维数组,所以我可能会先用一个简单的foreach循环来替换while循环。然后在该循环中对行执行什么操作,取决于你实际想让这个脚本执行什么操作。我通过添加一个sequ来重命名重复的列然后,生成新数组。我意识到我的循环只在列的范围内进行。但我不知道如何重写我的循环,他会继续重命名列,但也会重命名所有行。你的意思是某些列中存在重复值?请编辑您的问题,以包含一个适当的示例,说明您对特定样本输入的预期输出。
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;
}
$csv = array_map('str_getcsv', $lines);
$csv = array_map(function($l) { return str_getcsv($l, ';'); }, $lines);