Как очистить пустые поля при преобразовании CSV в JSON с помощью Miller?

У меня есть несколько CSV-файлов с данными об элементах для игры, с которой я возился, и мне нужно преобразовать их в JSON для использования. Данные могут быть довольно нерегулярными с несколькими пустыми полями на запись, что приводит к уродливому выводу JSON.

Пример с фиктивными значениями:

      Id,Name,Value,Type,Properties/1,Properties/2,Properties/3,Properties/4
01:Foo:13,Foo,13,ACME,CanExplode,IsRocket,,
02:Bar:42,Bar,42,,IsRocket,,,
03:Baz:37,Baz,37,BlackMesa,CanExplode,IsAlive,IsHungry,

Преобразованный вывод:

      [
{
  "Id": "01:Foo:13",
  "Name": "Foo",
  "Value": 13,
  "Type": "ACME",
  "Properties": ["CanExplode", "IsRocket", ""]
},
{
  "Id": "02:Bar:42",
  "Name": "Bar",
  "Value": 42,
  "Type": "",
  "Properties": ["IsRocket", "", ""]
},
{
  "Id": "03:Baz:37",
  "Name": "Baz",
  "Value": 37,
  "Type": "BlackMesa",
  "Properties": ["CanExplode", "IsAlive", "IsHungry"]
}
]

До сих пор я довольно успешно использовал . Мне удалось удалить полностью пустые столбцы из CSV, а также агрегироватьProperties/Xстолбцы в один массив.

Но теперь я хотел бы сделать еще две вещи, чтобы улучшить формат вывода, чтобы упростить использование JSON:

  • удалить пустые строки изPropertiesмножество
  • заменить другие пустые строки""(напримерTypeвторой записи) сnull

Желаемый результат:

      [
{
  "Id": "01:Foo:13",
  "Name": "Foo",
  "Value": 13,
  "Type": "ACME",
  "Properties": ["CanExplode", "IsRocket"]
},
{
  "Id": "02:Bar:42",
  "Name": "Bar",
  "Value": 42,
  "Type": null,
  "Properties": ["IsRocket"]
},
{
  "Id": "03:Baz:37",
  "Name": "Baz",
  "Value": 37,
  "Type": "BlackMesa",
  "Properties": ["CanExplode", "IsAlive", "IsHungry"]
}
]

Есть ли способ добиться этого с помощьюMiller?

Мои текущие команды:

  • mlr -I --csv remove-empty-columns file.csvочистить столбцы
  • mlr --icsv --ojson --jflatsep '/' --jlistwrap cat file.csv > file.jsonдля преобразования

1 ответ

Вероятно, это не так, как вы хотите это сделать. Я также использую jq.

Бег

      mlr --c2j  --jflatsep '/' --jlistwrap remove-empty-columns then cat input.csv | \
jq '.[].Properties|=map(select(length > 0))' | \
jq '.[].Type|=(if . == "" then null else . end)'

у тебя будет

      [
  {
    "Id": "01:Foo:13",
    "Name": "Foo",
    "Value": 13,
    "Type": "ACME",
    "Properties": [
      "CanExplode",
      "IsRocket"
    ]
  },
  {
    "Id": "02:Bar:42",
    "Name": "Bar",
    "Value": 42,
    "Type": null,
    "Properties": [
      "IsRocket"
    ]
  },
  {
    "Id": "03:Baz:37",
    "Name": "Baz",
    "Value": 37,
    "Type": "BlackMesa",
    "Properties": [
      "CanExplode",
      "IsAlive",
      "IsHungry"
    ]
  }
]
Другие вопросы по тегам