Петля Баш не остановит петлю - PullRequest
0 голосов
/ 07 марта 2019

У меня есть блоб JSON, структурированный так:

{
    "total_items": 2371,
    "page_count": 3,
    "items": [
        {
            "landing_id": "503a654cfaf5614b2069de304dbdb3c9",
            "token": "503a654cfaf5614b2069de304dbdb3c9",
            "response_id": "503a654cfaf5614b2069de304dbdb3c9",
            "landed_at": "2019-03-07T18:35:06Z",
            "submitted_at": "2019-03-07T18:36:17Z",
            "metadata": {
                "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.2 Safari/605.1.15",
                "platform": "other",
                "network_id": "321c8d9867",
                "browser": "default"
            },
            "answers": [
                {
                    "field": {
                        "id": "uqZV4j2RSapJ",
                        "type": "opinion_scale",
                        "ref": "bed55d05-b5e2-46dd-af91-337519830e3e"
                    },
                    "type": "number",
                    "number": 5
                }
            ],
        },
        {
            "landing_id": "b9d50e6734d30753de42b78a2ad5d741",
            "token": "b9d50e6734d30753de42b78a2ad5d741",
            "response_id": "b9d50e6734d30753de42b78a2ad5d741",
            "landed_at": "2019-03-07T18:12:29Z",
            "submitted_at": "2019-03-07T18:13:54Z",
            "metadata": {
                "user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1",
                "platform": "mobile",
                "network_id": "3a74e2b874",
                "browser": "touch"
            },
            "answers": [
                {
                    "field": {
                        "id": "uqZV4j2RSapJ",
                        "type": "opinion_scale",
                        "ref": "bed55d05-b5e2-46dd-af91-337519830e3e"
                    },
                    "type": "number",
                    "number": 1
                },
                {
                    "field": {
                        "id": "v8nQgm61VdLp",
                        "type": "dropdown",
                        "ref": "d20b5f19-dc7c-4497-b798-239924054367"
                    },
                    "type": "text",
                    "text": "Inconsistent information"
                }
            ],
        },
        {
            "landing_id": "96f601b5769bacf7208b1a9c8c390278",
            "token": "96f601b5769bacf7208b1a9c8c390278",
            "response_id": "96f601b5769bacf7208b1a9c8c390278",
            "landed_at": "2019-03-07T18:09:08Z",
            "submitted_at": "2019-03-07T18:09:40Z",
            "metadata": {
                "user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1",
                "platform": "mobile",
                "network_id": "1c59eb873c",
                "browser": "touch"
            },
            "answers": [
                {
                    "field": {
                        "id": "uqZV4j2RSapJ",
                        "type": "opinion_scale",
                        "ref": "bed55d05-b5e2-46dd-af91-337519830e3e"
                    },
                    "type": "number",
                    "number": 5
                },
                {
                    "field": {
                        "id": "llTPythU272I",
                        "type": "multiple_choice",
                        "ref": "bf54c521-3749-4c80-93bf-bb5448d03b34"
                    },
                    "type": "choices",
                    "choices": {
                        "labels": [
                            "Travis"
                        ]
                    }
                }
            ],
        }
    ]
}

Я собрал скрипт, который выглядит примерно так:

curl https://api.xyz.com/forms/Te8Fy9/responses?page_size=1000 -H 'Authorization: Bearer xxxxxx' -H 'cache-control: no-cache' > raw.json

page_parameter=`cat raw.json | jq -c '.items | last | .token' | tr -d '"'`

items_parameter=`cat raw.json | jq -c '.total_items'`

cat raw.json | jq -c '.items[]' > clean.json

bq load --source_format NEWLINE_DELIMITED_JSON --autodetect bq-test:sandox.test clean.json

while [[ ${#items_parameter} -gt 0 ]]
do

    curl 'https://api.xyz.com/forms/Te8Fy9/responses?page_size=1000&after='${page_parameter} -H 'Authorization: Bearer xxxxxx' -H 'cache-control: no-cache' > raw.json

    page_parameter=`cat returns_raw.json | jq -c '.items | last | .token' | tr -d '"'`

    items_parameter=`cat returns_raw.json | jq -c '.total_items'`

    cat returns_raw.json | jq -c '.items[]' > clean.json

    if [[  ${#items_parameter} -gt 0 ]]; then

        bq load --source_format NEWLINE_DELIMITED_JSON --autodetect bq-test:sandox.test clean.json

    fi

done

Итак, что я хочу сделать, это:

1.) Запустите вызов API (curl https...), сохраните как raw.json

2.) Сохраните указанное значение, последнее значение token, в качестве параметра. В этом примере это значение будет 96f601b5769bacf7208b1a9c8c390278 и сохранено как page_parameter

3.) Сохраните другое указанное значение, значение, связанное с total_items в верхней части. В этом экзамене это значение равно 2371 и хранится как items_parameter

4.) Используйте jq -c '.items[]' для очистки raw.json и создайте его как clean.json

5.) Нажмите на BigQuery

6.) При условии, что он работает правильно, он должен выдать items_parameter больше 0, что в этом случае принимает значение page_parameter, чтобы выполнить итерацию по команде subsuqent curl, чтобы получить следующие 1000 записей.

7.) Повторите шаг № 2 (page_parameter), шаг № 3 (items_parameter) и шаг № 4 (очистите raw.json и сохраните как clean.json)

8.) ЕСЛИ значение items_parameter больше 0, ТО загрузите его в BigQuery

Таким образом, есть надежда, что он будет делать это до тех пор, пока это значение не станет равным 0, и в этот момент он выйдет из цикла. Но это не так. Он просто постоянно перебирает одни и те же записи.

Теоретически он должен запустить три разных цикла загруженных записей: 1 - 1000, 1001 - 2000, 2001-2371, а затем прервать его.

Что мне не хватает? Я думаю, что я довольно близок и, вероятно, просто делаю что-то явно не так.

1 Ответ

0 голосов
/ 07 марта 2019

Похоже, у вас есть простая опечатка: вы выводите результат скручивания как raw.json, но используете cat returns_raw.json в качестве входных данных для ваших дальнейших команд JQ. Если вы исправите имя файла во всех местах, оно начнет работать?

...