Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразовать JSON в CSV 
:(
    Опции темы
Voldemar2004
  Дата 21.2.2019, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Есть такой файл:

Цитата

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 секунд
Т.е. чтобы выводилась область только один раз и город не повторялся.


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
bars80080
Дата 23.2.2019, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



с форматом объекта чуть накосячил. 
Цитата

"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);


PM MAIL WWW   Вверх
Voldemar2004
Дата 23.2.2019, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Файл 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.

Это сообщение отредактировал(а) Voldemar2004 - 23.2.2019, 20:19


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
whatisnot
Дата 24.2.2019, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 14.12.2014

Репутация: 1
Всего: 2



Цитата(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);
 
PM MAIL   Вверх
ksnk
Дата 25.2.2019, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



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

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1405 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.