У меня есть файл 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 обрабатывает строки.