合并列值相同的CSV行

时间:2014-10-07 14:23:44

标签: php csv

我有一个包含大约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来做到这一点,但我希望有更优雅和快速的方式。

2 个答案:

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