Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Преобразовать JSON в CSV


Автор: Voldemar2004 21.2.2019, 21:31
Есть такой файл:

Цитата

city,oblast,key_1,key_2,key_3
Ярославль,Ярославская область,fsdfd,312323,312345323
Ярославль,Ярославская область,fsdfd,312323,312376523
Рыбинск,Ярославская область,пвапаввапвап,3534523,375756323
Рыбинск,Ярославская область,пвапаввапвап,3534523,375756323
Рыбинск,Ярославская область,пвапаввапвап,3534523,375756323
Рыбинск,Ярославская область,пвапаввапвап,3534523,375756323
Рыбинск,Ярославская область,пвапаввапвап,3534523,375756323
Рыбинск,Ярославская область,пвапаввапвап,3534523,375756323
Москва,Московская область,пвапаввапвап,3534523,375756323
Москва,Московская область,пвапаввапвап,3534523,375756323
Москва,Московская область,пвапаввапвап,3534523,375756323
Химки,Московская область,пвапаввапвап,3534523,375756323
Химки,Московская область,пвапаввапвап,3534523,375756323
Химки,Московская область,пвапаввапвап,3534523,375756323


Как можно получить JSON вида:

"oblast" : "Московская область" {
       "city" : "Химки" {
                  "key_1" : "пвапаввапвап",
                  "key_2" : "3534523",
                  "key_3" : "375756323"
       },
       {
                  "key_1" : "пвапаввапвап",
                  "key_2" : "3534523",
                  "key_3" : "375756323"
       },
       {
                  "key_1" : "пвапаввапвап",
                  "key_2" : "3534523",
                  "key_3" : "375756323"
       },
       "city" : "Москва" {
                  "key_1" : "пвапаввапвап",
                  "key_2" : "3534523",
                  "key_3" : "375756323"
        },
        {
                  "key_1" : "пвапаввапвап",
                  "key_2" : "3534523",
                  "key_3" : "375756323"
        }
        {
                  "key_1" : "пвапаввапвап",
                  "key_2" : "3534523",
                  "key_3" : "375756323"
        }
},
"oblast" : "Ярославская область" {
       "city" : "Рыбинск" {
                  "key_1" : "пвапаввапвап",
                  "key_2" : "3534523",
                  "key_3" : "375756323"
       },
       {
                  "key_1" : "пвапаввапвап",
                  "key_2" : "3534523",
                  "key_3" : "375756323"
       },
       {
                  "key_1" : "пвапаввапвап",
                  "key_2" : "3534523",
                  "key_3" : "375756323"
       }
       {
                  "key_1" : "пвапаввапвап",
                  "key_2" : "3534523",
                  "key_3" : "375756323"
       }
       {
                  "key_1" : "пвапаввапвап",
                  "key_2" : "3534523",
                  "key_3" : "375756323"
       }
       {
                  "key_1" : "пвапаввапвап",
                  "key_2" : "3534523",
                  "key_3" : "375756323"
       },
       "city" : "Ярославль" {
                  "key_1" : "пвапаввапвап",
                  "key_2" : "3534523",
                  "key_3" : "375756323"
       },
       {
                  "key_1" : "пвапаввапвап",
                  "key_2" : "3534523",
                  "key_3" : "375756323"
       }
}

Добавлено через 12 минут и 45 секунд
Т.е. чтобы выводилась область только один раз и город не повторялся.

Автор: bars80080 23.2.2019, 01:25
с форматом объекта чуть накосячил. 
Цитата

"oblast" : "Московская область" {

нарушает пару "ключ-значение". впрочем, смысла объявлять oblast и city нет, они сами по себе будут ключами определённого уровня.

а в чём сложность взять и распарсить?

fopen, fgetcsv (или fread + explode) на чтение. а затем каждую строку разбитую на массив по разделителю загоняешь в матрицу многомерного массива

если
Химки,Московская область,пвапаввапвап,3534523,375756323
это $row
0, 1, 2, 3, 4

, то матрица получается так:

Код

$data[$row[1]][$row[0]][] = array(
    'key_1' => $row[2],
    'key_2' => $row[3],
    'key_3' => $row[4],
);


...

$json = json_encode($data);


Автор: Voldemar2004 23.2.2019, 20:17
Файл text.csv:

Цитата

city,region,operator,button,network
Ангарск,Иркутская область,Завод РТА,53,цифра
Ангарск,Иркутская область,Орион-экспресс,148,спутник
Ангарск,Иркутская область,МТС,29,спутник
Ангарск,Иркутская область,НТВ ПЛЮС,401,спутник
Иркутск,Иркутская область,Ростелеком,408,IPTV
Иркутск,Иркутская область,ТВ Регион,72,IPTV
Иркутск,Иркутская область,ТрансТелеКом,33,цифра
Иркутск,Иркутская область,ТрансТелеКом,31,IPTV / аналог
Иркутск,Иркутская область,Триколор,364,спутник
Иркутск,Иркутская область,Эр-Телеком,300,цифра
Иркутск,Иркутская область,Эр-Телеком,33,аналог
Арзамас,Нижегородская область,Кабельное Телевидение Вашей Семьи,49,цифра
Арзамас,Нижегородская область,МТС,200,цифра
Арзамас,Нижегородская область,МТС,28,аналог
Арзамас,Нижегородская область,МТС,29,спутник
Арзамас,Нижегородская область,НТВ ПЛЮС,401,спутник
Арзамас,Нижегородская область,Орион-экспресс,148,спутник
Арзамас,Нижегородская область,Ростелеком,408,IPTV
Арзамас,Нижегородская область,ТрансТелеКом,31,IPTV
Арзамас,Нижегородская область,Триколор,364,спутник


Код


<?php

$csv = array_map('str_getcsv', file('text.csv'));
array_walk($csv, function(&$a) use ($csv) {
  $a = array_combine($csv[0], $a);
});
array_shift($csv); # remove column header

echo jdecoder(json_encode($csv));

// декодируем русские символы
function jdecoder($json_str)
{
$cyr_chars = array(
    '\u0430' => 'а', '\u0410' => 'А',
    '\u0431' => 'б', '\u0411' => 'Б',
    '\u0432' => 'в', '\u0412' => 'В',
    '\u0433' => 'г', '\u0413' => 'Г',
    '\u0434' => 'д', '\u0414' => 'Д',
    '\u0435' => 'е', '\u0415' => 'Е',
    '\u0451' => 'ё', '\u0401' => 'Ё',
    '\u0436' => 'ж', '\u0416' => 'Ж',
    '\u0437' => 'з', '\u0417' => 'З',
    '\u0438' => 'и', '\u0418' => 'И',
    '\u0439' => 'й', '\u0419' => 'Й',
    '\u043a' => 'к', '\u041a' => 'К',
    '\u043b' => 'л', '\u041b' => 'Л',
    '\u043c' => 'м', '\u041c' => 'М',
    '\u043d' => 'н', '\u041d' => 'Н',
    '\u043e' => 'о', '\u041e' => 'О',
    '\u043f' => 'п', '\u041f' => 'П',
    '\u0440' => 'р', '\u0420' => 'Р',
    '\u0441' => 'с', '\u0421' => 'С',
    '\u0442' => 'т', '\u0422' => 'Т',
    '\u0443' => 'у', '\u0423' => 'У',
    '\u0444' => 'ф', '\u0424' => 'Ф',
    '\u0445' => 'х', '\u0425' => 'Х',
    '\u0446' => 'ц', '\u0426' => 'Ц',
    '\u0447' => 'ч', '\u0427' => 'Ч',
    '\u0448' => 'ш', '\u0428' => 'Ш',
    '\u0449' => 'щ', '\u0429' => 'Щ',
    '\u044a' => 'ъ', '\u042a' => 'Ъ',
    '\u044b' => 'ы', '\u042b' => 'Ы',
    '\u044c' => 'ь', '\u042c' => 'Ь',
    '\u044d' => 'э', '\u042d' => 'Э',
    '\u044e' => 'ю', '\u042e' => 'Ю',
    '\u044f' => 'я', '\u042f' => 'Я',

    '\r' => '',
    '\n' => '<br />',
    '\t' => ''
);

foreach ($cyr_chars as $key => $value) {
    $json_str = str_replace($key, $value, $json_str);
}
return $json_str;
}

?>


Хочу получить такой JSON:

Цитата

{
  "Ярославская область": [
    {
      "Рыбинск": [
        {
          "operator": "Ростелеком",
          "button": "408",
          "network": "IPTV"
        },
        {
          "operator": "Триколор",
          "button": "364",
          "network": "спутник"
        }
      ],
      "Ярославль": [
        {
          "operator": "Орион-экспресс",
          "button": "148",
          "network": "спутник"
        },
        {
          "operator": "Эр-Телеком",
          "button": "300",
          "network": "цифра"
        }
      ]
    }
  ],
  "Московская область": [
    {
      "Москва": [
        {
          "operator": "Ростелеком",
          "button": "408",
          "network": "IPTV"
        },
        {
          "operator": "Триколор",
          "button": "364",
          "network": "спутник"
        }
      ],
      "Химки": [
        {
          "operator": "Орион-экспресс",
          "button": "148",
          "network": "спутник"
        },
        {
          "operator": "Эр-Телеком",
          "button": "300",
          "network": "цифра"
        }
      ]
    }
  ]
}


Надо создать массив регионов и сравнивать построчно в файле csv ? Потом массив городов  и тоже построчно сравнивать ? Причем потом сортировка должна быть по городам и operator.

Автор: whatisnot 24.2.2019, 00:41
Цитата(Voldemar2004 @  23.2.2019,  20:17 Найти цитируемый пост)
декодируем русские символы


А это то вам зачем, чем это мешает для отображения на клиенте? Не нравиться, ну так, после получения массива $csv:

Код

foreach($csv as $v) $a[$v['region']][$v['city']][] = array_slice($v, 2);
//получаем json без преобразования в юникод
$json = json_encode($a, JSON_UNESCAPED_UNICODE);
 

Автор: ksnk 25.2.2019, 22:46
Цитата(Voldemar2004 @  23.2.2019,  20:17 Найти цитируемый пост)
адо создать массив регионов и сравнивать построчно в файле csv ?

Ничего нигде построчно не сравнивать.
Читать одну строку csv. Если в результирующем массиве нет секции с областью - заводим ее. Если в секции области нет секции города - заводим ее. остальные поля добавляем в секцию города. В чем конкретно проблемы?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)