使用 curl 或 RCurl 在 R 中下载并解压缩 JSON 文件

Download & decompress JSON file in R using curl or RCurl

我有以下 bash 脚本来下载和解压缩 JSON 文件:

#!/bin/sh -ex

# Ensure data directory (or a link) exists.
test -e results || mkdir results

# Download and decompress data.
curl -u $GISAID_USERNAME:$GISAID_PASSWORD --retry 4 \
  https://www.epicov.org/epi3/3p/$GISAID_FEED/export/provision.json.xz \
  | xz -d -T8 > results/gisaid.json

理想情况下,我希望有一个 R 函数来在给定目录中下载和解压缩此文件,环境变量高于 $GISAID_USERNAME、$GISAID_PASSWORD 和 $GISAID_FEED作为参数传递。谁知道如何做到这一点,例如使用包 curlRCurl? (不解压缩并保留为 .json.xz 也可以,因为我稍后会使用

读取文件
library(jsonlite)
GISAID_json <- jsonlite::stream_in(gzfile(".//data//GISAID_json//provision.json.xz"))

使用 system 函数在 R 中执行终端命令对您有帮助吗?

将您的终端调用输入 system(),它应该会执行并创建您的文件。然后读入文件。当然,您必须将 $GISAID_USERNAME、$GISAID_PASSWORD 替换为您的实际信息。如果登录信息或 url 应该是灵活的,您可以预先组合一个字符串,因为 system() 需要一个包含要执行的命令的字符串。

system("curl -u $GISAID_USERNAME:$GISAID_PASSWORD --retry 4 \
https://www.epicov.org/epi3/3p/$GISAID_FEED/export/provision.json.xz \
| xz -d -T8 > results/gisaid.json")

然后读入(希望如此)创建的文件。

无法使用您的设置进行测试,但对我来说,例如这个小例子成功创建了一个文件:

system("curl https://raw.githubusercontent.com/SteffenMoritz/imputeTS/master/pkgdown/favicon/favicon.ico > /Users/Steve/Downloads/x.ico")

像这样的东西应该可以工作:

library(curl)
library(glue)

custom_curl <- function(user, pass, feed, dest) {
  custom_handle <- curl::new_handle()
  curl::handle_setopt(
    custom_handle,
    username = user,
    password = pass
  )
  
  url <- glue::glue(
    "https://www.epicov.org/epi3/3p/{feed}/export/provision.json.xz"
  )
  
  curl::curl_download(url, dest, handle = custom_handle)
}

custom_curl('my_user', 'xxxxxx', 'feed1', 'dest/filename.json.xz')

由于我无法在真实文件中进行测试,而且 url,我不确定是否需要对函数进行少量修改,但至少是您的起点。