Как сохранить только определенные элементы JSON в новом столбце OpenRefine

{
    "business_id": "SQ0j7bgSTazkVQlF5AnqyQ",
    "full_address": "214 E Main St\nCarnegie\nCarnegie, PA 15106",
    "hours": {},
    "open": true,
    ** "categories": ["Chinese", "Restaurants"] ** ,
    "city": "Carnegie",
    "review_count": 9,
    "name": "Don Don Chinese Restaurant",
    "neighborhoods": ["Carnegie"],
    "longitude": -80.0849615,
    "state": "PA",
    "stars": 2.5,
    "latitude": 40.4083473,
    "attributes": {
        "Take-out": true,
        "Alcohol": "none",
        "Noise Level": "quiet",
        "Parking": {
            "garage": false,
            "street": false,
            "validated": false,
            "lot": false,
            "valet": false
        },
        "Delivery": true,
        "Has TV": true,
        "Outdoor Seating": false,
        "Attire": "casual",
        "Waiter Service": false,
        "Accepts Credit Cards": true,
        "Good for Kids": true,
        "Good For Groups": false,
        "Price Range": 1
    },
    "type": "business"
}

value.parseJson()['categories'] создаст новый столбец с именем 'categories' в OpenRefine, но возможно ли отфильтровать и сохранить 'chinese' как единственное значение и удалить какие-либо другие значения?

1 ответ

Решение

В приведенном выше примере выражение GREL:

value.parseJson()['categories']

В результате получается массив, содержащий два значения:

["Chinese", "Restaurants"]

Вы можете манипулировать этим с помощью выражений GREL, которые действуют на массивы. Например, чтобы выбрать первое значение в массиве, вы можете использовать:

value.parseJson()['categories'][0]

Который выберет первую запись в массиве (увеличьте число в квадратных скобках в конце выражения, чтобы выбрать другие записи в массиве)

Если вы хотите фильтровать определенное значение в массиве, вы можете использовать выражение "фильтр":

filter(value.parseJson()['categories'],v,v=="Chinese")

Это приведет к созданию нового массива, содержащего только слово "китайский" (в приведенном выше примере). Чтобы сохранить это в новом столбце, вам нужно преобразовать массив в строку:

filter(value.parseJson()['categories'],v,v=="Chinese").join("")

Чтобы избежать проблем с чувствительностью к регистру и возможностью многократного появления "китайского" в массиве "категорий", я бы сначала преобразовал значения в нижний регистр и лишил дубликат массива перед преобразованием в строку - так что вы заканчиваете с:

filter(forEach(value.parseJson()["categories"],v,v.toLowercase()),w,w=="chinese").uniques().join("")
Другие вопросы по тегам