У меня есть блоб 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, а затем прервать его.
Что мне не хватает? Я думаю, что я довольно близок и, вероятно, просто делаю что-то явно не так.