Json в CSV, используя JQ или любую другую команду bash - PullRequest
1 голос
/ 19 января 2020

Мне нужно проанализировать большой json файл в csv как можно быстрее. У меня есть следующий образец json файл:

{
    "status": "success",
    "data": {
        "candles": [
            ["2015-12-28T09:15:00+0530", 1386.4, 1388, 1381.05, 1385.1, 788],
            ["2015-12-28T09:16:00+0530", 1385.1, 1389.1, 1383.85, 1385.5, 609],
            ["2015-12-28T09:17:00+0530", 1385.5, 1387, 1385.5, 1385.7, 212],
            ["2015-12-28T09:18:00+0530", 1387, 1387.95, 1385.3, 1387.95, 1208],
            ["2015-12-28T09:19:00+0530", 1387, 1387.55, 1385.6, 1386.25, 716],
            ["2015-12-28T09:20:00+0530", 1386.95, 1389.95, 1386.95, 1389, 727],
            ["2015-12-28T09:21:00+0530", 1389, 1392.95, 1389, 1392.95, 291],
            ["2015-12-28T09:22:00+0530", 1392.95, 1393, 1392, 1392.95, 180],
            ["2015-12-28T09:23:00+0530", 1392.95, 1393, 1392, 1392.15, 1869],
            ["2016-01-01T13:22:00+0530", 1386.4, 1388, 1381.05, 1385.1, 788],
            ["2016-01-01T13:23:00+0530", 1385.1, 1389.1, 1383.85, 1385.5, 613],
            ["2016-01-01T13:24:00+0530", 1385.5, 1387, 1385.5, 1385.7, 212],
            ["2016-01-01T13:25:00+0530", 1387, 1387.95, 1385.3, 1387.95, 1208],
            ["2016-01-01T13:26:00+0530", 1387, 1387.55, 1385.6, 1386.25, 716],
            ["2016-01-01T13:27:00+0530", 1386.95, 1389.95, 1386.95, 1389, 727],
            ["2016-01-01T13:28:00+0530", 1389, 1392.95, 1389, 1392.95, 291],
            ["2016-01-01T13:29:00+0530", 1392.95, 1393, 1392, 1392.95, 180],
            ["2016-01-01T13:30:00+0530", 1392.95, 1393, 1392, 1392.15, 1869]
        ]
    }
}

Данные в вышеуказанном файле (скажем, data. json) должны быть отфильтрованы, а данные свечей должны быть сохранены в CSV-файле (скажем, вывод .csv). Я не могу получить данные .data.candles в CSV-файл. Ожидаемый результат:

2015-12-28T09:15:00+0530,1386.4,1388.0,1381.05,1385.1,788
2015-12-28T09:16:00+0530,1385.1,1389.1,1383.85,1385.5,609
2015-12-28T09:17:00+0530,1385.5,1387.0,1385.5,1385.7,212
2015-12-28T09:18:00+0530,1387.0,1387.95,1385.3,1387.95,1208
2015-12-28T09:19:00+0530,1387.0,1387.55,1385.6,1386.25,716
2015-12-28T09:20:00+0530,1386.95,1389.95,1386.95,1389.0,727
2015-12-28T09:21:00+0530,1389.0,1392.95,1389.0,1392.95,291
2015-12-28T09:22:00+0530,1392.95,1393.0,1392.0,1392.95,180
2015-12-28T09:23:00+0530,1392.95,1393.0,1392.0,1392.15,1869
2016-01-01T13:22:00+0530,1386.4,1388.0,1381.05,1385.1,788
2016-01-01T13:23:00+0530,1385.1,1389.1,1383.85,1385.5,613
2016-01-01T13:24:00+0530,1385.5,1387.0,1385.5,1385.7,212
2016-01-01T13:25:00+0530,1387.0,1387.95,1385.3,1387.95,1208
2016-01-01T13:26:00+0530,1387.0,1387.55,1385.6,1386.25,716
2016-01-01T13:27:00+0530,1386.95,1389.95,1386.95,1389.0,727
2016-01-01T13:28:00+0530,1389.0,1392.95,1389.0,1392.95,291
2016-01-01T13:29:00+0530,1392.95,1393.0,1392.0,1392.95,180
2016-01-01T13:30:00+0530,1392.95,1393.0,1392.0,1392.15,1869

Я могу сделать это за python, но из-за скорости я должен сделать это через jq.

Небольшая помощь здесь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 19 января 2020

Мне нужно проанализировать большой файл json в csv за минимальное время.

Если файл в указанном вами формате, вы можете найти простой Команда sed намного быстрее, чем jq. И, поскольку результирующий формат - .csv, а не. json, то любые проверки json, предоставляемые jq, здесь не будут применимы. Пример использования sed для этого:

$ sed -n 's/^\s*[[]\([^]]*\).*$/\1/;s/"//g;s/,\s/,/gp' sample.json
2015-12-28T09:15:00+0530,1386.4,1388,1381.05,1385.1,788
2015-12-28T09:16:00+0530,1385.1,1389.1,1383.85,1385.5,609
2015-12-28T09:17:00+0530,1385.5,1387,1385.5,1385.7,212
2015-12-28T09:18:00+0530,1387,1387.95,1385.3,1387.95,1208
2015-12-28T09:19:00+0530,1387,1387.55,1385.6,1386.25,716
2015-12-28T09:20:00+0530,1386.95,1389.95,1386.95,1389,727
2015-12-28T09:21:00+0530,1389,1392.95,1389,1392.95,291
2015-12-28T09:22:00+0530,1392.95,1393,1392,1392.95,180
2015-12-28T09:23:00+0530,1392.95,1393,1392,1392.15,1869
2016-01-01T13:22:00+0530,1386.4,1388,1381.05,1385.1,788
2016-01-01T13:23:00+0530,1385.1,1389.1,1383.85,1385.5,613
2016-01-01T13:24:00+0530,1385.5,1387,1385.5,1385.7,212
2016-01-01T13:25:00+0530,1387,1387.95,1385.3,1387.95,1208
2016-01-01T13:26:00+0530,1387,1387.55,1385.6,1386.25,716
2016-01-01T13:27:00+0530,1386.95,1389.95,1386.95,1389,727
2016-01-01T13:28:00+0530,1389,1392.95,1389,1392.95,291
2016-01-01T13:29:00+0530,1392.95,1393,1392,1392.95,180
2016-01-01T13:30:00+0530,1392.95,1393,1392,1392.15,1869

sed, будучи чистым потоковым редактором, вы можете найти его на порядок быстрее, чем эквивалентная операция с использованием jq. Кроме того, решение jq в другом ответе не удаляет двойные кавычки вокруг поля даты и времени. Попробуйте ...

0 голосов
/ 19 января 2020

В одну сторону:

$ jq -r '.data.candles[] | @csv' data.json
"2015-12-28T09:15:00+0530",1386.4,1388,1381.05,1385.1,788
"2015-12-28T09:16:00+0530",1385.1,1389.1,1383.85,1385.5,609
"2015-12-28T09:17:00+0530",1385.5,1387,1385.5,1385.7,212
"2015-12-28T09:18:00+0530",1387,1387.95,1385.3,1387.95,1208
"2015-12-28T09:19:00+0530",1387,1387.55,1385.6,1386.25,716
"2015-12-28T09:20:00+0530",1386.95,1389.95,1386.95,1389,727
"2015-12-28T09:21:00+0530",1389,1392.95,1389,1392.95,291
"2015-12-28T09:22:00+0530",1392.95,1393,1392,1392.95,180
"2015-12-28T09:23:00+0530",1392.95,1393,1392,1392.15,1869
"2016-01-01T13:22:00+0530",1386.4,1388,1381.05,1385.1,788
"2016-01-01T13:23:00+0530",1385.1,1389.1,1383.85,1385.5,613
"2016-01-01T13:24:00+0530",1385.5,1387,1385.5,1385.7,212
"2016-01-01T13:25:00+0530",1387,1387.95,1385.3,1387.95,1208
"2016-01-01T13:26:00+0530",1387,1387.55,1385.6,1386.25,716
"2016-01-01T13:27:00+0530",1386.95,1389.95,1386.95,1389,727
"2016-01-01T13:28:00+0530",1389,1392.95,1389,1392.95,291
"2016-01-01T13:29:00+0530",1392.95,1393,1392,1392.95,180
"2016-01-01T13:30:00+0530",1392.95,1393,1392,1392.15,1869

Он просто отправляет все элементы массива свечей в выходной форматер @csv, по одному, и выводит необработанные результаты вместо обработки каждой строки вывода. в виде строки JSON (опция -r).

Чтобы сохранить результаты в файле в сценарии, просто используйте перенаправление вывода, как обычно:

jq -r '.data.candles[] | @csv' data.json > output.csv
...