我有一个包含大约30列和2.5K行的大型CSV文件。
除了一些列之外,有些行具有完全相同的值。
我想将那些相似的内容合并,并用不同列的值之间的逗号连接。
小例子:
id name age kid
1 Tom 40 John
1 Tom 40 Roger
---merged becomes---
1 Tom 40 John, Roger
我可以使用PHP使用大量的fors和ifs来做到这一点,但我希望有更优雅和快速的方式。
答案 0 :(得分:1)
对于常见的编程问题,这是一个很好的初学者问题。你想要做的是一个两步的方法。首先,将CSV解析为可以轻松修改的数据结构,然后遍历该结构并生成与输出匹配的新数组。
<?php
// Parse CSV into rows like:
$rows = array(
array(
'id' => 1,
'name' => 'Tom',
'age' => 50,
'kid' => 'John'
),
array(
'id' => 1,
'name' => 'Tom',
'age' => 50,
'kid' => 'Roger'
),
array(
'id' => 2,
'name' => 'Pete',
'age' => 40,
'kid' => 'Pete Jr.'
),
);
// Array for output
$concatenated = array();
// Key to organize over
$sortKey = 'id';
// Key to concatenate
$concatenateKey = 'kid';
// Separator string
$separator = ', ';
foreach($rows as $row) {
// Guard against invalid rows
if (!isset($row[$sortKey]) || !isset($row[$concatenateKey])) {
continue;
}
// Current identifier
$identifier = $row[$sortKey];
if (!isset($concatenated[$identifier])) {
// If no matching row has been found yet, create a new item in the
// concatenated output array
$concatenated[$identifier] = $row;
} else {
// An array has already been set, append the concatenate value
$concatenated[$identifier][$concatenateKey] .= $separator . $row[$concatenateKey];
}
}
// Do something useful with the output
var_dump($concatenated);
答案 1 :(得分:1)
如果您只有CSV文件中的数据,我认为最简单的方法就是使用公共数据作为键来构建一个关联数组,如果存在则修改它:
$array=[];
while ($a=fgetcsv($handle)){
if (isset($array[$a[0]."-".$a[1]."-".$a[2]])) {
$array[$a[0]."-".$a[1]."-".$a[2]].=",".$a[3];
}
else {
$array[$a[0]."-".$a[1]."-".$a[2]]=$a[3];
}
}