【问题标题】:JQ Array to new fieldsJQ 数组到新字段
【发布时间】:2017-09-06 00:30:57
【问题描述】:

我有一个示例 json 数据,例如:

{
  "phone_number": "780-414-2085",
  "city": "Edmonton",
  "updated": "2015-10-19T00:03:10",
  "name": "Sir William Place ",
  "url": "http://www.bwalk.com/en-CA/Rent/Details/Alberta/Edmonton/Sir-William-Place",
  "last_visited": "2015-10-19T00:03:10",
  "rooms": [{
    "available": "Available",
    "bathrooms": ["1"],
    "suite_type": "1 Bedroom",
    "square_feet": ["594", "649"],
    "deposit": ["$499"],
    "price_range": ["$1059", "$1209"]
  }, {
    "available": "Available",
    "bathrooms": ["1"],
    "suite_type": "1 Bedroom + Den",
    "square_feet": ["771"],
    "deposit": ["$499"],
    "price_range": ["$1169", "$1249"]
  }, {
    "available": "Available",
    "bathrooms": ["1", "2"],
    "suite_type": "2 Bedroom",
    "square_feet": ["894", "970"],
    "deposit": ["$499"],
    "price_range": ["$1344", "$1494"]
  }, {
    "available": "Available",
    "bathrooms": ["2"],
    "deal": ["October FREE and $299 Security Deposit on 12 month leases "],
"suite_type": "2 Bedroom Bi-level",
"square_feet": ["894"],
"deposit": ["$499"],
"price_range": ["$1344", "$1394"]
  }, {
    "available": "Waiting List",
    "bathrooms": ["1"],
    "suite_type": "Bachelor",
    "square_feet": ["540"],
    "deposit": ["$499"],
    "price_range": ["$1004", "$1054"]
  }],
  "address": "8830-85 St., Edmonton, Alberta, T6C 3C3",
  "zip_code": "T6C 3C3"
}

我正在运行一个 jq 表达式,例如:

'{phone_number, city, updated, name, address, zip_code, url, last_visited} + (.rooms[] | {suite_type, price_range_start: .price_range[0], price_range_end: .price_range[1]} + {available, square_foot_start:.square_feet[0], square_foot_end:.square_feet[1], deposit:.deposit[0], bathrooms:.bathrooms[0]})'

这给了我一个好的输出,但重复了相同的名称,因为我只列出了房间数组。我希望能够将房间数组中的每个项目设置为房间1、房间2、房间3等。但也可以将它保存在一个条目中,例如这里的示例它最终有5个条目,因为有5个房间和例如,名称被重复 5 次,因为我现在设置它的方式。我想我需要将房间映射到某些东西,但不知道该怎么做。

有人可以建议如何做到这一点吗?

【问题讨论】:

  • 我不确定我是否理解预期的输出是什么,以及它与您得到的输出有何不同。你能提供一个你希望输出的样本吗?
  • 好吧,我在找什么,因为这最终将输出到 csv 是获取房间数组并为数组中的每个项目创建 cols,例如 room0/available、room0/bahrroms、 room0/suite_type, room0/square_feet, room0/deposit, room0/price_start, room0/price_end, room1/available, room1/bathrooms 等等这样的标题,然后是每个的值。希望这是有道理的。
  • 您可能会发现this answer 很有用。
  • 谢谢圣地亚哥,很棒的回答!

标签: json jq


【解决方案1】:

您可以更新数组中的元素,同时保留其他元素,如下所示:

'.rooms[] |=  {suite_type, price_range_start: .price_range[0],
  price_range_end: .price_range[1]} + {available,
  square_foot_start:.square_feet[0], square_foot_end:.square_feet[1],
  deposit:.deposit[0], bathrooms:.bathrooms[0]}'

【讨论】:

    【解决方案2】:

    这是一个使用函数的解决方案。

    def common_columns:
       "phone_number", "city", "updated", "name", "address", "zip_code", "url", "last_visited"
    ;
    def common:
       .phone_number, .city, .updated, .name, .address, .zip_code, .url, .last_visited
    ;
    def room_columns(n):
         range(n)
       | (
          "available_\(.)", "bathrooms_\(.)", "suite_type_\(.)",
          "square_feet_start_\(.)", "square_feet_end_\(.)", "deposit_\(.)",
          "price_range_start_\(.)", "price_range_end_\(.)"
         )
    ;
    def rooms(n):
         . as $r
       | range(n)
       | $r.rooms[.]
       | (
           .available, .bathrooms[0], .suite_type,
           .square_feet[0,1], .deposit[0], .price_range[0,1]
         )
    ;
    
      [ common_columns, room_columns(6) ]
    , [ common,         rooms(6) ]
    | @csv
    

    您可以将6 更改为您需要的任意多组房间列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多