【问题标题】:How to map an object to arrays so it can be converted to csv?如何将对象映射到数组以便可以将其转换为 csv?
【发布时间】:2013-12-09 11:51:30
【问题描述】:

我正在尝试转换如下所示的对象:

{
  "123" : "abc",
  "231" : "dbh",
  "452" : "xyz"
}

到如下所示的 csv:

"123","abc"
"231","dbh"
"452","xyz"

我更喜欢使用命令行工具jq,但似乎无法弄清楚如何进行分配。我设法通过jq '. | keys' test.json 获得了密钥,但不知道下一步该做什么。

问题是您无法使用@csv 将这样的 k:v 对象直接转换为 csv。它需要是一个数组,所以我们需要先转换为一个数组。如果键被命名,它会很简单,但它们是动态的,所以它不是那么容易。

【问题讨论】:

  • 为什么不只是 gsub ':' for ',' ?
  • google JSON to csv ...很多结果

标签: json jq


【解决方案1】:

试试这个 给出你想要的相同输出

echo '{"123":"abc","231":"dbh","452":"xyz"}' | jq -r 'to_entries | .[] | "\"" + .key + "\",\"" + (.value | tostring)+ "\""'

【讨论】:

    【解决方案2】:

    这是我今天早上最终使用的一个示例(处理 PagerDuty 警报):

    cat /tmp/summary.json | jq -r '
      .incidents
      | map({desc: .trigger_summary_data.description, id:.id})
      | group_by(.desc)
      | map(length as $len
      | {desc:.[0].desc, length: $len}) 
      | sort_by(.length) 
      | map([.desc, .length] | @csv)
      | join("\n") '
    

    这会转储一个 CVS 分隔的文档,如下所示: "[Triggered] Something annoyingly frequent",31 "[Triggered] Even more frequent alert!",35 "[No data] Stats Server is probably acting up",55

    【讨论】:

      【解决方案3】:

      试试这个过滤器:

      to_entries[] | [.key, .value]
      
      • to_entries 将对象转换为键/值对象数组。 [] 将数组分解为数组中的每个项
      • 然后对于每个项目,转换为包含键和值的数组。

      这会产生以下输出:

      [
        "123",
        "abc"
      ],
      [
        "231",
        "dbh"
      ],
      [
        "452",
        "xyz"
      ]
      

      然后您可以使用@csv 过滤器将行转换为 CSV 行。

      $ echo '{"123":"abc","231":"dbh","452":"xyz"}' | jq -r 'to_entries[] | [.key, .value] | @csv'
      "123","abc"
      "231","dbh"
      "452","xyz"
      

      【讨论】:

      • 嗯。对我来说,这会返回“\"123\",\"abc\"" 等。即每行都被额外引用。
      • 确保将-r 标志添加到调用中。你会想要得到原始输出。
      • 谢谢,我忽略了这一点。
      • 如何在 JSON 中间使用to_entries 进行哈希处理?我见过的所有示例都假设目标哈希位于根目录。
      【解决方案4】:
      onecol2txt () {
       awk 'BEGIN { RS="_end_"; FS="\n"}
         { for (i=2; i <= NF; i++){
             printf "%s ",$i 
             }
           printf "\n" 
         }'
      }
      cat jsonfile | jq -r -c '....,"_end_"' | onecol2txt
      

      【讨论】:

        【解决方案5】:

        Jeff 的回答是一个很好的起点,更接近您的预期:

        cat input.json | jq 'to_entries | map([.key, .value]|join(","))'
        
        [
         "123,abc",
         "231,dbh",
         "452,xyz"
        ]
        

        但没有找到使用换行符加入的方法:

        cat input.json | jq 'to_entries | map([.key, .value]|join(","))|join("\n")'
        
        "123,abc\n231,dbh\n452,xyz"
        

        【讨论】:

        • "\n" 是换行符的 JSON 表示;要将其视为文字换行符,请使用 jq 的 -r 命令行选项。但是,一般来说,使用@csv 获取 CSV 是更好的方法,因为@csv 确实会生成有效的 CSV。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-25
        • 1970-01-01
        相关资源
        最近更新 更多