2015-10-21 3 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]})' 

Это дает мне ОК выход, но повторяет одни и те же имена потому что я просто перечисляю массив комнат. Я хочу иметь возможность устанавливать каждый элемент в массиве комнат, например, в комнату 1, комнату2, комнату3 и т. Д. Но также держать ее в одной записи, так, например, с образцом здесь она заканчивается 5 записями, потому что есть 5 комнат и имя, например, повторяется 5 раз, потому что теперь у меня он установлен. Я думаю, мне нужно сопоставить комнаты, но не знаю, как это сделать.

Может ли кто-нибудь посоветовать, как это сделать?

+0

Я не уверен, насколько я понимаю, каков ожидаемый результат и как он отличается от того, который вы получаете. Можете ли вы предоставить образец того, что вы хотели бы получить? –

+0

Хорошо, что я ищу, так как это будет выведено в csv, в конце концов, это взять массив комнат и сделать cols для каждого элемента массива, чтобы что-то вроде room0/available, room0/bathrroms, room0/suite_type, room0/square_feet , room0/deposit, room0/price_start, room0/price_end, room1/available, room1/bathroom etc и т. д. так, чтобы это были заголовки, а затем значение для каждого. Надеюсь, это имеет смысл. – 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 к однако много наборов номеров столбцов нужно.

Смежные вопросы