преобразовать csv-файл в json, где одно из полей может быть преобразовано в массив

#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"
    ]
  }
]