Объединение двух файлов JSON для округов США - PullRequest
0 голосов
/ 17 июня 2020

У меня есть файл json, который отфильтрован по округам США и содержит в разделе «Свойства» средний доход. Таким образом, этот файл json содержит медианный доход по округам.

{
  "type": "Topology",
  "transform": {
    "scale": [
      0.035896170617061705,
      0.005347309530953095
    ],
    "translate": [
      -179.14734,
      17.884813
    ]
  },
  "objects": {
    "us_counties_20m": {
      "type": "GeometryCollection",
      "geometries": [
        {
          "type": "Polygon",
          "arcs": [
            [
              0,
              1,
              2,
              3,
              4
            ]
          ],
          "id": "0500000US01001",
          "properties": {
            "PRICE": 48863
          }
        },
        {
          "type": "Polygon",
          "arcs": [
            [
              5,
              6,
              7,
              8,
              9,
              10
            ]
          ],
          "id": "0500000US01009",
          "properties": {
            "PRICE": 41940
          }
        },
        {
          "type": "Polygon",
          "arcs": [
            [
              11,
              12,
              13,
              14,
              15
            ]
          ],
          "id": "0500000US01017",
          "properties": {
            "PRICE": 33500
          }
        },
        {
          "type": "Polygon",
          "arcs": [
            [
              16,
              17,
              -3,
              18,
              19,
              20,
              21
            ]
          ],
          "id": "0500000US01021",
          "properties": {
            "PRICE": 38833
          }
        },

I wi sh, чтобы добавить в раздел «свойства» другую цену, а именно среднюю цену дома на округ. Итак, у меня есть второй json файл с такими данными:

[
 {
   "Full County Number": 56045,
   "Price-RangeQ42019": "$150,000-$350,000",
   "Geography": "Weston County,  Wyoming",
   "Latitude (generated)": 43.8403,
   "Longitude (generated)": -104.5684,
   "Q42019 Price": "$178,218"
 },
 {
   "Full County Number": 56043,
   "Price-RangeQ42019": "$150,000-$350,000",
   "Geography": "Washakie County,  Wyoming",
   "Latitude (generated)": 43.8356,
   "Longitude (generated)": -107.6602,
   "Q42019 Price": "$170,665"
 },

, где я хочу, чтобы все категории 2-го json были добавлены в раздел «свойства» как отдельная категория.

Желаемый результат (раздел «Свойства» содержит дополнительную информацию):

{
  "type": "Topology",
  "transform": {
    "scale": [
      0.035896170617061705,
      0.005347309530953095
    ],
    "translate": [
      -179.14734,
      17.884813
    ]
  },
  "objects": {
    "us_counties_20m": {
      "type": "GeometryCollection",
      "geometries": [
        {
          "type": "Polygon",
          "arcs": [
            [
              0,
              1,
              2,
              3,
              4
            ]
          ],
          "id": "0500000US01001",
          "properties": {
            "PRICE": 48863
            "Price-RangeQ42019": "$150,000-$350,000",
            "Geography": "Washakie County,  Wyoming",
            "Latitude (generated)": 43.8356,
            "Longitude (generated)": -107.6602,
            "Q42019 Price": "$170,665"
          }
        },
etc...

«Идентификатор» и «Полный номер округа» в первом и втором файлах json совпадают именно. Однако в «Полном номере округа» нет префикса «0500000US» перед каждым округом. Как мне объединить эти 2 json файлов, чтобы получить третий json с дополнительным свойством?

Заранее большое спасибо.

1 Ответ

1 голос
/ 17 июня 2020

Следующее должно приблизиться к предоставлению решения. Сначала создается словарь ($ dict), а затем этот словарь используется для обновления первого файла.

Вызов:

jq -n -f program.jq secondfile.json firstfile.json

где program.jq содержит:

def lpad:
  tostring | if length < 5 then ("00000" + .) | .[-5:] else . end;


(input
 | map( with_entries(if .key == "Full County Number" 
                     then .key = "id" | .value |= "0500000US" + lpad 
                     else .
                     end ) )
   | INDEX(.[]; .id) ) as $dict
| inputs
| .objects.us_counties_20m.geometries |= 
      map( .id as $id 
           | (.properties += $dict[$id]) )
...