Как объединить значения из нескольких строк с одним и тем же идентификатором в запятую, разделенные уникальным идентификатором

У меня есть файл CSV, назовите его data.csv , который выглядит так:

 id,position,data 1,1,Data text 1,2,Data text 2 1,3,Data text 3 2,1,Data text x 2,2,Data text y 

Мне нужно объединить значения в полевых data в одном для всех строк с одним и тем же id . Затем напечатайте эти вновь полученные строки в другом CSV-файле.

Мне удалось упорядочить значения в массиве, но при преобразовании в файл CSV он сохраняет только один из них.

Вот мой код

 $file = 'data.csv'; $tsvFile = new SplFileObject($file); $tsvFile->setFlags(SplFileObject::READ_CSV); $tsvFile->setCsvControl(","); foreach ($tsvFile as $line => $row) { if ($line > 0) { $newData[$row[0]] = array('id'=>$row[0], 'position'=>$row[1], 'data'=>$row[2]); $newData[$row[1]] = $row[2]; } } // echo '<pre>'; var_dump($newData); // $fp = fopen('data2.csv', 'w'); foreach ($newData as $fields) { fputcsv($fp, $fields); } fclose($fp); 

В итоге полученный CSV-файл должен выглядеть так:

 id,data "1","Data text, Data text 1, Data text 2" "2","Data text x, Data text y" 

Ну, я думаю, вы могли бы сделать то, что попросите более простым способом.

Я просто использовал функции fgetcsv() и fputcsv() для обработки выделения и вставки хорошо сформированной и хорошо отформатированной строки из / в файл.

 $output = array(); if ($in_handle = fopen('data.csv', 'r')) { // discard the first line, the one with the names of the fields $input = fgetcsv($in_handle); // get an array out of a row from the file data.csv while ($input = fgetcsv($in_handle)) { // create an array with only the needed fields $current_row = array( 'id' => $input[0], 'data' => $input[2] ); if (array_key_exists($current_row['id'], $output)) { $output[$current_row['id']]['data'] .= ' ' . $current_row['data']; } else { $output[$current_row['id']] = $current_row; } } fclose($in_handle); if ($out_handle = fopen('new_file.csv', 'w')) { // recreate the first line of the file deleted before $fields_names = array('id', 'data'); fputcsv($out_handle, $fields_names); // begins at 1 because there isn't any value before for ($i = 1; $i <= count($output); ++$i) fputcsv($out_handle, $output[$i]); } fclose($out_handle); } 

Вот вход, который я использовал для проверки скрипта:

 id,position,data 1,1,first string 1,2,second string 1,3,third string 2,1,fourth string 2,2,fifth string 

И вот выходной файл, который я получил:

 id,data 1,"first string second string third string" 2,"fourth string fifth string" 

Как вы можете видеть, часть данных строк теперь цитируется. Именно так стандартная CSV обрабатывает строки.