2015-05-21 25 views
5

Môi trường: JQ 1.5, Windows 64 bit.Xử lý JSON của mảng trong mảng với jq

Tôi có JSON sau:

{ 
    "unique": 1924, 
    "coordinates": [ 
    { 
     "time": "2015-01-25T00:00:01.683", 
     "xyz": [ 
     { 
      "z": 4, 
      "y": 2, 
      "x": 1, 
      "id": 99 
     }, 
     { 
      "z": 9, 
      "y": 9, 
      "x": 8, 
      "id": 100 
     }, 
     { 
      "z": 9, 
      "y": 6, 
      "x": 10, 
      "id": 101 
     } 
     ] 
    }, 
    { 
     "time": "2015-01-25T00:00:02.790", 
     "xyz": [ 
     { 
      "z": 0, 
      "y": 3, 
      "x": 7, 
      "id": 99 
     }, 
     { 
      "z": 4, 
      "y": 6, 
      "x": 2, 
      "id": 100 
     }, 
     { 
      "z": 2, 
      "y": 9, 
      "x": 51, 
      "id": 101 
     } 
     ] 
    } 
    ] 
} 

Và muốn chuyển đổi nó sang định dạng CSV này với JQ:

unique,time,id,x,y,z 
1924,"2015-01-25T00:00:01.683",99,1,2,4 
1924,"2015-01-25T00:00:01.683",100,8,9,9 

(và vân vân)

Tôi đã thử một vài mọi thứ, chẳng hạn như:

jq -r '{unique: .unique, coordinates: .coordinates[].xyz[] | [.id, .x, .y, .z], time: .coordinates.[].time} | flatten | @csv' 

đã cho tôi JSON mong muốn của tôi, nhưng nhân với mọi id, x, y và z (tức là mỗi dòng duy nhất xuất hiện bốn lần - mỗi dòng cho id, x, y, z).

Gán một số để mảng, chẳng hạn như

jq -r '{unique: .unique, coordinates: .coordinates[0].xyz[] | [.id, .x, .y, .z], time: .coordinates.[0].time} | flatten | @csv' 

mang lại cho tôi những chỉ số đầu tiên của mảng coordinates, nhưng tôi muốn tất cả trong số họ, một cách tự nhiên.

+0

Đối với ngôn ngữ nào? Javascript? –

+2

Với jq (http://stedolan.github.io/jq/) – innocentunremarkable

+0

Mmm. Yêu cầu xây dựng rất gần đây, ở đó; Tôi vẫn còn trên 1,4. Nhưng sau đó, đó là cách của các tính năng sáng bóng ... –

Trả lời

5

Bước đầu tiên là làm phẳng kết quả xuống các hàng.

[{ unique } + (.coordinates[] | { time } + .xyz[])] 

này sẽ mang lại một mảng của các đối tượng cho mỗi hàng:

[ 
    { 
    "unique": 1924, 
    "time": "2015-01-25T00:00:01.683", 
    "id": 99, 
    "x": 1, 
    "y": 2, 
    "z": 4 
    }, 
    { 
    "unique": 1924, 
    "time": "2015-01-25T00:00:01.683", 
    "id": 100, 
    "x": 8, 
    "y": 9, 
    "z": 9 
    }, 
    { 
    "unique": 1924, 
    "time": "2015-01-25T00:00:01.683", 
    "id": 101, 
    "x": 10, 
    "y": 6, 
    "z": 9 
    }, 
    { 
    "unique": 1924, 
    "time": "2015-01-25T00:00:02.790", 
    "id": 99, 
    "x": 7, 
    "y": 3, 
    "z": 0 
    }, 
    ... 
] 

Sau đó, nó chỉ là vấn đề của việc chuyển đổi này để hàng csv.

["unique","time","id","x","y","z"] as $fields | $fields, (.[] | [.[$fields[]]]) | @csv 
+0

p.s., điều này cũng có tác dụng đối với phiên bản 1.4. –

+0

Cảm ơn! Tôi đã sử dụng mô hình flatten/@csv cho các lệnh trước đó - là phương pháp của bạn để chuyển đổi sang CSV nhanh hơn/hiệu quả hơn, bạn có nói không? – innocentunremarkable

+0

Tôi không nghĩ rằng 'flatten' sẽ thực sự làm việc ở đây. Nó có nghĩa là để flatten mảng của mảng, không phải đối tượng. Và bạn sẽ không muốn sử dụng nó vì làm phẳng một đối tượng sẽ mang lại giá trị. Bạn sẽ mất các khóa liên quan và yêu cầu không được bảo đảm. Bạn sẽ cần phải chuyển đổi sang các dạng trung gian khác để sử dụng tốt hơn. Cách tiếp cận tôi thực hiện ở đây là trực tiếp hơn vì vậy tôi mong đợi nó sẽ tương đối nhanh hơn là cố gắng làm cho nó hoạt động với việc làm phẳng. –

Các vấn đề liên quan