#arrays #json #csv
#массивы #json #csv — файл #csv
Вопрос:
В настоящее время я работаю над объединением некоторых данных в виде csv-файла с намерением преобразовать его в объект json. Например, вот как выглядит пара строк моих данных (первая строка — это заголовок с заголовками каждого столбца).
Scientific Name | Threats | Range States
Psittacula eupatria | illegal trade, habitat loss | Afghanistan, Bangladesh, Bhutan
Cacatua alba | illegal trade, overharvesting|Indonesia
Мне было интересно, для полей, с которыми связано более одного элемента (например, для первой строки для угроз — незаконная торговля, потеря среды обитания, а для государств ареала — Афганистан, Бангладеш, Бутан), есть ли способ сохранить их в массивах при преобразовании csv-файла в json?
значит, json будет выглядеть примерно так?
[
{"Scientific Name": "Psittacula eupatria",
"Threats":["illegal trade", "habitat loss"],
"Range States":["Afghanistan","Bangladesh","Bhutan"]
},
{"Scientific Name": "Cacatua alba",
"Threats":["illegal trade", "overharvesting"],
"Range States":["Indonesia"]
}
]
Комментарии:
1. Вы что-нибудь тестировали? Если да, не могли бы вы показать нам соответствующий код?
2. Нет, я еще не написал скрипт для этого, я просто хотел посмотреть, есть ли простая альтернатива. Javascript или python?
Ответ №1:
Безусловно.
Как только у вас есть целая строка "illegal trade, habitat loss"
в вашем коде в качестве переменной, вы можете просто разделить ее на запятые (включая пробел). То, как вы это делаете, зависит от того, с каким языком / платформой вы работаете.
Javascript:
let csvCell = { ... };
let cellArray = csvCell.split(", ");
// cellArray contains ["illegal trade", "habitat loss"]
Python / Ruby:
csv_cell = { ... }
cell_array = csv_cell.split(", ")
# cell_array contains ["illegal trade", "habitat loss"]
Вперед:
import "strings"
var csvCell string = { ... }
var cellArray = strings.Split(csvCell, ", ")
и т.д. и т.п.
Ответ №2:
Вот решение с использованием jq
Если файл filter.jq
содержит
[
split("n") # split string into lines
| [.[0] | split("|")[]] as $headers # split header
| (.[1:][] | split("|")) # split data
| select(length>0) # eliminate blanks
| [ [ $headers, . ] #
| transpose[] # assemble objects
| {key:.[0], value:.[1]|split(", ")} # from keys and values
] | from_entries #
]
и data
содержит
Scientific Name|Threats|Range States
Psittacula eupatria|illegal trade, habitat loss|Afghanistan, Bangladesh, Bhutan
Cacatua alba|illegal trade, overharvesting|Indonesia
затем команда
jq -M -R -s -r -f filter.jq data
создаст вывод
[
{
"Scientific Name": [
"Psittacula eupatria"
],
"Threats": [
"illegal trade",
"habitat loss"
],
"Range States": [
"Afghanistan",
"Bangladesh",
"Bhutan"
]
},
{
"Scientific Name": [
"Cacatua alba"
],
"Threats": [
"illegal trade",
"overharvesting"
],
"Range States": [
"Indonesia"
]
}
]