CSV для JSON с PHP?

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

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;

Ответ 1

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

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

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

Ответ 2

Я изменил ответ в вопросе, чтобы использовать первую строку 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);
}

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

Я рекомендую использовать 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();

Ответ 6

Ни один из этих ответов не работает с многострочными ячейками, потому что все они предполагают, что строка заканчивается на "\n". Встроенная функция 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
}