2015-10-21 55 views
0

我有一个样品JSON数据,如:JQ阵列到新的领域

{ 
    "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]})' 

这给了我一个确定的输出,但重复相同的名称因为我只列出房间数组。我希望能够将房间数组中的每个项目设置为诸如room1,room2,room3等之类的东西。但是也要将其保存在一个条目中,因此,例如,在此示例中,它将结束5个条目,因为有5个房间和例如名称重复5次,因为我现在设置的方式。我想我需要将房间映射到某些东西上,但不知道如何去做。

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

+0

我不确定我是否理解预期输出的内容以及它与您所得到的不同之处。你能提供一个你想要的输出样本吗? –

+0

好的我在找什么,因为这将输出到csv到最后是采取房间数组,并为阵列中的每个项目,所以像room0/available,room0/bathrroms,room0/suite_type,room0/square_feet ,room0 /存款,room0/price_start,room0/price_end,room1/available,room1 /浴室等等,因此这将是标题,然后是每个值。希望这是有道理的。 – Tom

+0

你可能会发现[这个答案](http://stackoverflow.com/a/33290267/3899165)有用。 –

回答

0

可以更新数组中的元素,同时保持其它元件是这样的:

'.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]}' 
0

这里是使用功能的解决方案。

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更改为您需要的多组房间列。