【问题标题】:Convert json filtered into csv with jq用jq将过滤后的json转换成csv
【发布时间】:2019-07-23 06:44:31
【问题描述】:

我的文件如下所示:

$ cat sample-test.json |jq .
{
  "logRef": "c4fa4367-23f6-462f-b5fd-f972d0916a30",
  "timestamp": 1563268297545,
  "someOtherField": "nonImportantValue"
}
{
  "logRef": "c4fa4367-23f6-462f-b5fd-f972d0916a31",
  "timestamp": 1563268297595,
  "someOtherField2": "nonImportantValue3"
}

我想像这样将它转换为 csv:

logRef;timestamp
c4fa4367-23f6-462f-b5fd-f972d0916a30;1563268297545
c4fa4367-23f6-462f-b5fd-f972d0916a31;1563268297595

我在尝试

$ cat sample-test.json |jq '.logRef, .timestamp |@csv'
jq: error (at <stdin>:1): string ("c4fa4367-2...) cannot be csv-formatted, only array
jq: error (at <stdin>:2): string ("c4fa4367-2...) cannot be csv-formatted, only array

【问题讨论】:

    标签: json csv jq


    【解决方案1】:

    您的输入很好(它是一个 JSON 流)。

    您的过滤器的问题是@csv 需要一个数组。所以这会起作用:

    [.logRef,.timestamp] | @csv
    

    但是它引用了字符串,所以如果你希望你的字符串不被引用(这可能意味着结果不会是 CSV),那么你可以使用:

    "\(.logRef),\(.timestamp)"
    

    在所有情况下,您都需要使用 jq's-r 命令行选项。

    【讨论】:

      【解决方案2】:

      您的 json 文件中的问题。看起来它的格式不正确(没有根数组元素 [] 和文档之间的逗号)。如果您修复它,jq 将按预期工作。

      > cat sample-test.json 
      [{
        "logRef": "c4fa4367-23f6-462f-b5fd-f972d0916a30",
        "timestamp": 1563268297545,
        "someOtherField": "nonImportantValue"
      },
      {
        "logRef": "c4fa4367-23f6-462f-b5fd-f972d0916a31",
        "timestamp": 1563268297595,
        "someOtherField2": "nonImportantValue3"
      }]
      
      cat sample-test.json |jq -r 'map(.logRef), map(.timestamp) | @csv'
      "c4fa4367-23f6-462f-b5fd-f972d0916a30","c4fa4367-23f6-462f-b5fd-f972d0916a31"
      1563268297545,1563268297595
      

      我还用map() 函数修复了该命令。

      【讨论】:

      • 请注意 jq 允许 JSON 流。从某种意义上说,这就是 jq 的全部意义——它基本上是面向流的。您可以通过建议 -s 命令行选项来挽救您的答案(在某种程度上)。但同样,jq 的全部意义在于,在这种情况下,通过不要求输入是数组或转换为单个 JSON 实体,可以轻松处理比内存容量更大的文件。
      猜你喜欢
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      相关资源
      最近更新 更多