2012-03-08 14 views
1

と.CSVファイルに同じIDを持つ行をマージします:私は、私は同じ「ID」と「行」をマージしたいnames.csv、私はこのようなCSV-ファイルを持っているPHP

"id","name" 
"1","John" 
"2","Joe" 
"3","Peter" 
"4","Frank" 
"5","Bill" 
... 
"2","Steve" 
"5","James" 
"2","Mark" 
"4","Anthony" 

次の結果に到達してください:

"id","name" 
"1","John" 
"2","Joe , Steve , Mark" 
"3","Peter" 
"4","Frank , Anthony" 
"5","Bill , James" 

私はこれをPHP言語で行いたいのですが、解決策はありません。 は私の自己によって私はいくつかのコードを作ったが、それは私のSERVERHOST(ループのループ)のために多くの作業になります:

$myFile = "merged-names.csv"; 
$fh = fopen($myFile, 'w') or die("can't open file"); 

if (($handle = fopen("names.csv", "r")) !== FALSE) 
{ 
    $line = fgets($handle); 
    $val = explode(",", $line); 
    $max = (count($val))/2; 

    for ($i=0; $i <= $max; $i+2) 
    { 
    $id = $val[$i]; 
    $name = $val[$i+1]; 
    $stringData = "\"".$id."\"".","; 
    fwrite($fh, $stringData); 
    $stringData = "\"".$name."\""; 
    fwrite($fh, $stringData); 

    for ($e=0; $e <= $max; $e+2) 
    { 
    if (strcmp($id, $val[$e]) == 0) 
    { 
     if($i != $e) 
    { 
     $stringData = "\"".$val[$e+1]."\""; 
     fwrite($fh, $stringData); 
     } 
    } 
    } 

    $stringData = "<br>"; 
    fwrite($fh, $stringData); 

    } 
fclose($handle); 
} 

誰かがこのために適切なソリューションで私を助けることができる、問題なので、単純に思えますか? ありがとうございます!ここで

答えて

0

これはどう...

$temp = array(); 
if (($handle = fopen("names.csv", "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     $name = $data[1]; 
     $id = $data[0]; 
     if (!isset($temp[$id])) 
      $temp[$id] = array(); 
     $temp[$id][$name] = 1; 
    } 
    fclose($handle); 
} 
foreach ($temp as $k => $v) { 
    echo $k.","."\"".implode(",", array_keys($v))."\""."\n"; 
} 
2

は私がやるだろうと何:

$lines = file('merged-names.csv'); 

foreach($lines as $line) 
{ 
    list($id, $name) = explode(',', $line); 
    $id = trim($id, '"');  
    $name = trim($name, '"'); 
    $merged[$id][] = $name; 
} 

foreach($merged as $id => $vals) 
{ 
    echo '"' . $id . '", "' . implode(',', $vals) . "\"\n"; 
} 
関連する問題