CSV для JSON с PHP?

Мне нужно преобразовать CSV- файл в JSON на сервере с помощью PHP. Я использую этот скрипт, который работает:

function csvToJSON($csv) { $rows = explode("\n", $csv); $i = 0; $len = count($rows); $json = "{\n" . ' "data" : ['; foreach ($rows as $row) { $cols = explode(',', $row); $json .= "\n {\n"; $json .= ' "var0" : "' . $cols[0] . "\",\n"; $json .= ' "var1" : "' . $cols[1] . "\",\n"; $json .= ' "var2" : "' . $cols[2] . "\",\n"; $json .= ' "var3" : "' . $cols[3] . "\",\n"; $json .= ' "var4" : "' . $cols[4] . "\",\n"; $json .= ' "var5" : "' . $cols[5] . "\",\n"; $json .= ' "var6" : "' . $cols[6] . "\",\n"; $json .= ' "var7" : "' . $cols[7] . "\",\n"; $json .= ' "var8" : "' . $cols[8] . "\",\n"; $json .= ' "var9" : "' . $cols[9] . "\",\n"; $json .= ' "var10" : "' . $cols[10] . '"'; $json .= "\n }"; if ($i !== $len - 1) { $json .= ','; } $i++; } $json .= "\n ]\n}"; return $json; } $json = csvToJSON($csv); $json = preg_replace('/[ \n]/', '', $json); header('Content-Type: text/plain'); header('Cache-Control: no-cache'); echo $json; 

Переменная $csv представляет собой строку, полученную из запроса cURL, который возвращает содержимое CSV.

Я уверен, что это не самый эффективный PHP-код для этого, потому что я начинающий разработчик, и мои знания PHP низки. Есть ли лучший, более эффективный способ преобразования CSV в JSON с использованием PHP?

Заранее спасибо.

Заметка. Я знаю, что добавляю пробелы, а затем удаляю его, поэтому я могу иметь возможность возвращать «читаемый» JSON, удаляя строку $json = preg_replace('/[ \n]/', '', $json); для целей тестирования.

Редактировать. Спасибо за ваши ответы, на их основе новый код выглядит так:

 function csvToJson($csv) { $rows = explode("\n", trim($csv)); $csvarr = array_map(function ($row) { $keys = array('var0','var1','var2','var3','var4','var5','var6','var7','var8','var9','var10'); return array_combine($keys, str_getcsv($row)); }, $rows); $json = json_encode($csvarr); return $json; } $json = csvToJson($csv); header('Content-Type: application/json'); header('Cache-Control: no-cache'); echo $json; 

Related of "CSV для JSON с PHP?"

Ну, есть функция json_encode (), которую вы должны использовать, а не самостоятельно создавать JSON-выход. Также существует функция str_getcsv () для синтаксического анализа CSV:

 $array = array_map("str_getcsv", explode("\n", $csv)); print json_encode($array); 

Однако вы должны адаптировать массив $, если вы хотите, чтобы на выходе JSON были сохранены именованные поля.

Я изменил ответ в вопросе, чтобы использовать первую строку CSV для ключей массива. Это имеет то преимущество, что вам не нужно жестко программировать ключи в функции, позволяющие ему работать для любых CSV с заголовками столбцов и любым количеством столбцов.

Вот моя модифицированная версия:

 function csvToJson($csv) { $rows = explode("\n", trim($csv)); $data = array_slice($rows, 1); $keys = array_fill(0, count($data), $rows[0]); $json = array_map(function ($row, $key) { return array_combine(str_getcsv($key), str_getcsv($row)); }, $data, $keys); return json_encode($json); } 

Некоторые советы …

  • Если у вас открыто открытие URL-адресов для fopen() и оболочек, вы можете использовать fgetscsv() .
  • Вы можете создать массив CSV, а затем преобразовать его в собственный json_encode() PHP.
  • Правильный тип mime для JSON – application/json .

Вероятно, вы могли бы уменьшить накладные расходы, удалив все пробелы и \ n. Но это в вашей записке.

Вы можете увеличить производительность, пропустив preg_replace и передав логическое значение, которое будет включать и выключать его.

Кроме этого, переменная разворачивание вашего var [1-10] на самом деле является хорошей, если всегда есть десять валебелей.

Взрыв и подход foreach просто прекрасны.

Я рекомендую использовать Coseva (библиотека синтаксического анализа csv) и использовать встроенный метод toJSON ().

 <?php // load require('../src/CSV.php'); // read $csv = new Coseva\CSV('path/to/my_csv.csv'); // parse $csv->parse(); // disco echo $csv->toJSON(); 

Ни один из этих ответов не работает с многострочными ячейками, потому что все они предполагают, что строка заканчивается на «\ n». fgetcsv функция fgetcsv понимает, что многострочные ячейки заключены в «так что она не запускается в одну и ту же проблему. Ниже приведенный ниже код вместо того, чтобы полагаться на« \ n », чтобы найти каждую строку csv, позволяет fgetcsv идти по строкам и готовить наши вывод.

 function csv_to_json($file){ $columns = fgetcsv($file); // first lets get the keys. $output = array(); // we will build out an array of arrays here. while(!feof($file)){ // until we get to the end of file, we'll pull in a new line $line = fgetcsv($file); // gets the next line $lineObject = array(); // we build out each line with our $columns keys foreach($columns as $key => $value){ $lineObject[$value] = $line[$key]; } array_push($output, $lineObject); } return json_encode($output); // encode it as json before sending it back }