【问题标题】:How can I clean up empty fields when converting CSV to JSON with Miller?使用 Miller 将 CSV 转换为 JSON 时如何清理空字段?
【发布时间】:2022-10-07 19:32:47
【问题描述】:

我有几个项目数据的 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"]
}
]

到目前为止,我使用Miller 非常成功。我已经设法从 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 用于转换

【问题讨论】:

    标签: json csv miller


    【解决方案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"
        ]
      }
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 2012-11-30
      • 2015-08-23
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多