Преобразование массива JSON в CSV

Я обнаружил, что конфигурация по умолчанию(default.vim)не загружается, если вы создаете файл ~/.vimrc, поэтому я поместил содержимое конфигурации по умолчанию в vimrc и добавил модификации в конце..

Я предполагаю, что у вас есть vim8 и вы используете конфигурации по умолчанию (, т.е. у вас нет файла ~/.vimrc)

Скопируйте конфигурацию по умолчанию в ваш пользовательский файл vimrc:

cp /usr/share/vim/vim80/defaults.vim ~/.vimrc

Затем откройте файл ~/.vimrcи добавьте свои конфигурации в его конец.

5
01.03.2020, 19:50
2 ответа

Проблема не в том, что JSON, который вы показываете, представляет собой массив, а в том, что каждый элемент массива (, из которого у вас есть только один ), представляет собой довольно сложную структуру. Можно легко извлечь соответствующие данные из каждой записи массива в более короткий плоский массив и преобразовать его в CSV с помощью @csvв jq:

.
jq -r '.[] | [
       .id,
       .link,
       .metadata."@context",
       .metadata."@type",
       .metadata.name,
       .metadata.inLanguage,
       .metadata.image,
       .metadata.author[0]."@type",
       .metadata.author[0].name,
       .metadata.license."@type",
       .metadata.license.url,
       .metadata.license.name
] | @csv' file.json

... но обратите внимание, как я вынужден решить, что нас всегда интересует только первый автор (структура .metadata.authorsub -является массивом ).

Выход:

"4","https://pressbooks.online.ucf.edu/amnatgov/","http://schema.org","Book","American Government","en","https://pressbooks.online.ucf.edu/app/uploads/sites/4/2020/01/American-Government.png","Person","OpenStax","CreativeWork","https://creativecommons.org/licenses/by/4.0/","CC BY (Attribution)"

Чтобы создать строки с именами авторов, которые представляют собой конкатенацию всех имен авторов (и аналогично для типов авторов ), с ;в качестве разделителя,вы могли бы вместо .metadata.author[0].nameв приведенном выше примере использовать[.metadata.author[].name]|join(";")[.metadata.author[]."@type"]|join(";")для типа ), чтобы ваша команда стала

jq -r '.[] | [
       .id,
       .link,
       .metadata."@context",
       .metadata."@type",
       .metadata.name,
       .metadata.inLanguage,
       .metadata.image,
        ( [.metadata.author[]."@type" ] | join(";") ),
        ( [.metadata.author[].name    ] | join(";") ),
       .metadata.license."@type",
       .metadata.license.url,
       .metadata.license.name
] | @csv' file.json
13
28.04.2021, 23:21

С помощью Miller(https://github.com/johnkerl/miller)вы можете «сгладить» JSON, запустив

mlr --j2c cat input.json >output.csv
+----+---------------------------------------------+-------------------+----------------+---------------------+---------------------+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------+---------------------------------------+-------------------------+------------------------+------------------------+--------------------------------+-------------------------------+------------------------+----------------------------------------------+-----------------------+-----------------------------------------------------+---------------------------------------------------------------------------+-----------------------------------------------------------------+
| id | link                                        | metadata:@context | metadata:@type | metadata:name       | metadata:inLanguage | metadata:copyrightYear | metadata:disambiguatingDescription                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | metadata:image                                                                        | metadata:isBasedOn                    | metadata:author:0:@type | metadata:author:0:name | metadata:datePublished | metadata:copyrightHolder:@type | metadata:copyrightHolder:name | metadata:license:@type | metadata:license:url                         | metadata:license:name | _links:api:0:href                                   | _links:metadata:0:href                                                    | _links:self:0:href                                              |
+----+---------------------------------------------+-------------------+----------------+---------------------+---------------------+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------+---------------------------------------+-------------------------+------------------------+------------------------+--------------------------------+-------------------------------+------------------------+----------------------------------------------+-----------------------+-----------------------------------------------------+---------------------------------------------------------------------------+-----------------------------------------------------------------+
| 4  | https://pressbooks.online.ucf.edu/amnatgov/ | http://schema.org | Book           | American Government | en                  | 2016                   | The content of this textbook has been developed and arranged to provide a logical progression from the fundamental principles of institutional design at the founding, to avenues of political participation, to thorough coverage of the political structures that constitute American government. The book builds upon what students have already learned and emphasizes connections between topics as well as between theory and applications. The goal of each section is to enable students not just to recognize concepts, but to work with them in ways that will be useful in later courses, future careers, and as engaged citizens.  | https://pressbooks.online.ucf.edu/app/uploads/sites/4/2020/01/American-Government.png | https://ucf-dev.pb.unizin.org/pos2041 | Person                  | OpenStax               | 2016-01-06             | Organization                   | cnxamgov                      | CreativeWork           | https://creativecommons.org/licenses/by/4.0/ | CC BY (Attribution)   | https://pressbooks.online.ucf.edu/amnatgov/wp-json/ | https://pressbooks.online.ucf.edu/amnatgov/wp-json/pressbooks/v2/metadata | https://pressbooks.online.ucf.edu/wp-json/pressbooks/v2/books/4 |
+----+---------------------------------------------+-------------------+----------------+---------------------+---------------------+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------+---------------------------------------+-------------------------+------------------------+------------------------+--------------------------------+-------------------------------+------------------------+----------------------------------------------+-----------------------+-----------------------------------------------------+---------------------------------------------------------------------------+-----------------------------------------------------------------+

, а затем извлеките нужные поля и переименуйте их, используя

mlr -I --csv cut -f "id","link","metadata:@context","metadata:@type","metadata:name","metadata:inLanguage","metadata:image","metadata:author:0:@type","metadata:author:0:name","metadata:license:@type","metadata:license:url","metadata:license:name" \
then label id,link,context,type,name,inLanguage,image,author_type,author_name,license_type,license_url,license_name output.csv

Вывод будет

+----+---------------------------------------------+-------------------+------+---------------------+------------+---------------------------------------------------------------------------------------+-------------+-------------+--------------+----------------------------------------------+---------------------+
| id | link                                        | context           | type | name                | inLanguage | image                                                                                 | author_type | author_name | license_type | license_url                                  | license_name        |
+----+---------------------------------------------+-------------------+------+---------------------+------------+---------------------------------------------------------------------------------------+-------------+-------------+--------------+----------------------------------------------+---------------------+
| 4  | https://pressbooks.online.ucf.edu/amnatgov/ | http://schema.org | Book | American Government | en         | https://pressbooks.online.ucf.edu/app/uploads/sites/4/2020/01/American-Government.png | Person      | OpenStax    | CreativeWork | https://creativecommons.org/licenses/by/4.0/ | CC BY (Attribution) |
+----+---------------------------------------------+-------------------+------+---------------------+------------+---------------------------------------------------------------------------------------+-------------+-------------+--------------+----------------------------------------------+---------------------+
7
28.04.2021, 23:21

Теги

Похожие вопросы