Структура JSON

desaps

Новичок
Подскажите пожалуйста в создании такой JSON структуры. Пытаюсь сделать конвертацию данных из txt в json.

Код:
из
"Date","Time","bbbbb","ccccc","ddddd","eeeee","fffff"
01.01.2021,22:00:00,0,89844,0,89874,0,89794,0,89824,0
01.01.2021,23:00:00,0,89824,0,89874,0,89784,0,89814,0
01.01.2021,23:00:00,0,89814,0,89904,0,89804,0,89834,0
01.01.2021,23:00:00,1,12521,1,12607,1,12501,1,12607,0
01.01.2021,23:00:00,1,12607,1,12672,1,12584,1,12671,0
01.01.2021,23:00:00,1,12671,1,12732,1,12627,1,12666,0

----------------
// В исходном файле, числа с плавающей точкой идут с запятой, а нужно с точкой. Данные нужно привести к такому виду + объединить колонки

"DateTime"         ,"bbbbb","ccccc","ddddd","eeeee","fffff"
01.01.2021 22:00:00,0.89844,0.89874,0.89794,0.89824,0
01.01.2021 23:00:00,0.89824,0.89874,0.89784,0.89814,0
01.01.2021 23:00:00,0.89814,0.89904,0.89804,0.89834,0
01.01.2021 23:00:00,1.12521,1.12607,1.12501,1.12607,0
01.01.2021 23:00:00,1.12607,1.12672,1.12584,1.12671,0
01.01.2021 23:00:00,1.12671,1.12732,1.12627,1.12666,0

----------------
// Нужен JSON  такой структуры.
{
"datetime": [
01.01.2021,22:00:00,
01.01.2021,22:00:00,
01.01.2021,22:00:00,
01.01.2021,22:00:00
],
"bbbbb": [
343,
345,
234,
565
],
"ccccc": [
234,
654,
234,
234
],
"ddddd": [
75789,
75883,
73485,
5138
],
"eeeee": [
75789,
75883,
73485,
5138
],
"fffff": [
75789,
75883,
73485,
5138
],
"s": "ok",
}

пока что на этом этапе
Код:
<?php
$handle = fopen("test.txt", "r");
$first = TRUE;
$cols      = array();
$new_array = array();

  while(($buffer = fgetcsv($handle, 0, ",")) !== FALSE)
    {
      if($first)
        {
          $cols = $buffer;
          $first = FALSE;
        }
       else
        {
          foreach($buffer as $key => $value)
           {
            $new_array[$cols[$key]][] = $value;
           }
        }
    }
fclose($handle);

print_r($new_array);
?>
Там, где обрабатывается остальная часть файла(не заголовки) объединить нужные элементы массива в дополнительный массив, конкатенацией. А уже его обрабатывать в цикле.
 
Последнее редактирование:

ksnk

прохожий
В исходном файле, числа с плавающей точкой идут с запятой, а нужно с точкой.
Это что такое? может правильнее будет получить правильные данные, а не считать, что вот эта вот запятая - кому надо запятая, а эта - на самом деле точка ? Или попытаться сохранить данные не в csv с запятыми-разделителями, а, например с точчкой с запятой или, чоуж - с табуляцией ?
 

Фанат

oncle terrible
Команда форума
Собственно, при чем тут json-то вообще?
вопрос ведь не в том как написать примитивный цикл, а что делать с кривым исходным файлом
 

desaps

Новичок
Эхх... Приходится работать с тем что уже есть, исходный файл не возможно поменять + уже много где зависимостей. Здесь как раз тот случай когда нельзя ничего поменять (исходный файл). Такой разбор будет выполнятся раз на 4 месяца, а то и реже...
 

Фанат

oncle terrible
Команда форума
ещё раз.
вопрос озаглавлен "Структура JSON"
при чем здесь Структура JSON, если речь идет о структуре кривого текстового файла?
 

Valick

Новичок
desaps, не бестолковься, тебе делают правильное замечание. Основная задача - это распарсить текстовый файл в массив. А JSON преобразование - это всего лишь одна строка $jsonStr = json_encode($array);
 

ksnk

прохожий
В качестве совсем уж временного решения - можно регулярками править прочитанную строчку. Или тупо считать, что в поле XXXX нужно слить обязательно пару рядом стоящих цифирок. А в поле FFFF как нибудь само сложится... Только уточнить, как люди по этому файлу сами то различают это целая или дробная часть числа. 5 цифр - значит обязательно дробная? А если 1-2 цифры - значит целая часть?
А если точное целое число выводится - будет пропущено поле или запятая таки будет выведена ?
 

Valick

Новичок
исходный файл не возможно поменять
в целом это крайне странно, заменить разделитель на точку с запятой никакого труда не составит
перейти с txt на тот же xml , что будет более грамотно, тоже не так уж и сложно
ну и в конце концов, можно сразу перейти на обмен данными в формате JSON
другое дело, что для такой работы потребуется программист...
 

desaps

Новичок
PS:
В полях "bbbbb","ccccc","ddddd","eeeee" будут всегда дробные(с плавающей точкой) числа
А в поле "fffff" будут всегда целые числа

нужно сделать так... объединить колонки
1 с 2, 3 c 4, 5 c 6, 7 c 8, 9 c 10, 11

В итоге должно быть
Код:
"DateTime"         ,"bbbbb","ccccc","ddddd","eeeee","fffff"
01.01.2021 22:00:00,0.89844,0.89874,0.89794,0.89824,0
01.01.2021 23:00:00,0.89824,0.89874,0.89784,0.89814,0
01.01.2021 23:00:00,0.89814,0.89904,0.89804,0.89834,0
01.01.2021 23:00:00,1.12521,1.12607,1.12501,1.12607,0
01.01.2021 23:00:00,1.12607,1.12672,1.12584,1.12671,0
01.01.2021 23:00:00,1.12671,1.12732,1.12627,1.12666,0
 

desaps

Новичок
в целом это крайне странно, заменить разделитель на точку с запятой никакого труда не составит
перейти с txt на тот же xml , что будет более грамотно, тоже не так уж и сложно
ну и в конце концов, можно сразу перейти на обмен данными в формате JSON
другое дело, что для такой работы потребуется программист...
Дело в том что данные предоставлены в txt, и хранятся еще за "царя гороха". Сейчас стоит задача из "костыля" сделать человеческий вид ....
 

ksnk

прохожий
Сейчас стоит задача из "костыля" сделать человеческий вид
Вообще-то ставится задача прикрутить костыль к говноданным, чтобы хоть как-то можно было ковылять:)
Вместо вот этого куска
Код:
       else
        {
          foreach($buffer as $key => $value)
           {
            $new_array[$cols[$key]][] = $value;
           }
        }
    }
fclose($handle);
лепим вот такое
Код:
       else
        {
            $new_array['datetime'][]=$buffer [0].' '.$buffer [1];
            for($i=1;$i<count($cols);$i++) {
                if ($i * 2 + 1 < count($buffer)) {
                    $new_array[$cols[$i + 1]][] = buffer [$i * 2 + 0] . '.' . $buffer [$i * 2 + 1];
                } else {
                    $new_array[$cols[$i + 1]][] = buffer [$i * 2 + 0] ;
                }
            }
        }
    }
fclose($handle);
 

ksnk

прохожий
А, ну да. В цикле с перебором столбиков с названиями, ухватываю лишнее название :( Вот так должно быть более правильно
Начало того цикла сейчас с 2 и формула вычисления кусочков данных, соответственно, изменилась . Ну и добавился контроль, если в файле с данными что-то пошло не так
Код:
else
        {
            if(count($buffer)<2) continue; // кривые данные просто идут лесом. Так и надо ?
            $new_array['datetime'][]=$buffer [0].' '.$buffer [1];
            for($i=2;$i<count($cols);$i++) { // начинаем с поля идущего после date,time,
                if ($i * 2 - 1 < count($buffer)) {
                    $new_array[$cols[$i + 1]][] = $buffer [$i * 2 - 2]. '.' . $buffer [$i * 2 - 1];
                } else {
                    $new_array[$cols[$i + 1]][] = $buffer [$i * 2 - 2] ;
                }
            }
        }
    }
fclose($handle);
 

ksnk

прохожий
разбиваем по запятой а не по пробелам
из "Date","Time","bbbbb","ccccc","ddddd","eeeee","fffff"
01.01.2021,22:00:00,0,89844,0,89874,0,89794,0,89824,0
01.01.2021,23:00:00,0,89824,0,89874,0,89784,0,89814,0
Э... ну, там сложно с результатом. Где-то я увидел пробел и склейку даты-времени...
Данные нужно привести к такому виду + объединить колонки

"DateTime" ,"bbbbb","ccccc","ddddd","eeeee","fffff"
01.01.2021 22:00:00,0.89844,0.89874,0.89794,0.89824,0
 

desaps

Новичок
А, ну да. В цикле с перебором столбиков с названиями, ухватываю лишнее название :( Вот так должно быть более правильно
Начало того цикла сейчас с 2 и формула вычисления кусочков данных, соответственно, изменилась . Ну и добавился контроль, если в файле с данными что-то пошло не так
Код:
else
        {
            if(count($buffer)<2) continue; // кривые данные просто идут лесом. Так и надо ?
            $new_array['datetime'][]=$buffer [0].' '.$buffer [1];
            for($i=2;$i<count($cols);$i++) { // начинаем с поля идущего после date,time,
                if ($i * 2 - 1 < count($buffer)) {
                    $new_array[$cols[$i + 1]][] = $buffer [$i * 2 - 2]. '.' . $buffer [$i * 2 - 1];
                } else {
                    $new_array[$cols[$i + 1]][] = $buffer [$i * 2 - 2] ;
                }
            }
        }
    }
fclose($handle);
Спасибо большое !

Все хорошо, только название колонок съехали. Колонки bbbbb нету. Последняя колонка должна быть fffff, а она пуста

Посмотреть вложение 1640949707273.png


В редактируемом txt файле нету кривых данных и склейок по дате.
 
Последнее редактирование:

ksnk

прохожий
PHP:
<?php

$handle = fopen("test.txt", "r");
$first = TRUE;
$cols = array();
$new_array = array();

while (($buffer = fgetcsv($handle, 0, ",")) !== FALSE) {
    if ($first) {
        $cols = $buffer;
        $first = FALSE;
    } else {
        if (count($buffer) < 2) continue; // кривые данные просто идут лесом. Так и надо ?
        $new_array['datetime'][] = $buffer [0] . ' ' . $buffer [1];
        for ($i = 2; $i < count($cols); $i++) { // начинаем с поля идущего после date,time,
            if ($i * 2 - 1 < count($buffer)) {
                $new_array[$cols[$i]][] = $buffer [$i * 2 - 2] . '.' . $buffer [$i * 2 - 1];
            } else {
                $new_array[$cols[$i]][] = $buffer [$i * 2 - 2];
            }
        }
    }
}
fclose($handle);

echo json_encode($new_array, JSON_PRETTY_PRINT);
JSON:
{
    "datetime": [
        "01.01.2021 22:00:00",
        "01.01.2021 23:00:00",
        "01.01.2021 23:00:00",
        "01.01.2021 23:00:00",
        "01.01.2021 23:00:00",
        "01.01.2021 23:00:00"
    ],
    "bbbbb": [
        "0.89844",
        "0.89824",
        "0.89814",
        "1.12521",
        "1.12607",
        "1.12671"
    ],
    "ccccc": [
        "0.89874",
        "0.89874",
        "0.89904",
        "1.12607",
        "1.12672",
        "1.12732"
    ],
    "ddddd": [
        "0.89794",
        "0.89784",
        "0.89804",
        "1.12501",
        "1.12584",
        "1.12627"
    ],
    "eeeee": [
        "0.89824",
        "0.89814",
        "0.89834",
        "1.12607",
        "1.12671",
        "1.12666"
    ],
    "fffff": [
        "0",
        "0",
        "0",
        "0",
        "0",
        "0"
    ]
}
 
Последнее редактирование:
Сверху