Php 如何在读取csv时指定分隔符?
我正在尝试解析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 = '"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);