R 字符串匹配以下载某些文件

R 字符串匹配以下载某些文件,r,regex,R,Regex,我希望从cms.gov下载2018年和2019年以及今后所有年份的季度NDC HCPCS人行横道文件 从文件名来看,每个季度它们似乎都略有变化,但总体结构相同: 年份mon/mon year-*-NDC-HCPCS-Crosswalk.zip 以下是我希望下载的历史文件名: 2018-1月-ASP-NDC-HCPCS-Crosswalk.zip 2018-4月-ASP-NDC-HCPCS-Crosswalk.zip 2018-7月-NDC-HCPCS-Crosswalk.zip 2018-10-

我希望从cms.gov下载2018年和2019年以及今后所有年份的季度NDC HCPCS人行横道文件

从文件名来看,每个季度它们似乎都略有变化,但总体结构相同:

年份mon/mon year-*-NDC-HCPCS-Crosswalk.zip

以下是我希望下载的历史文件名:

2018-1月-ASP-NDC-HCPCS-Crosswalk.zip 2018-4月-ASP-NDC-HCPCS-Crosswalk.zip 2018-7月-NDC-HCPCS-Crosswalk.zip 2018-10-NDC-HCPCS-Crosswalk.zip 2019年1月-ASP-NDC-HCPCS-Crosswalk.zip 2019年4月-ASP-NDC-HCPCS-Crosswalk.zip 2019-July-ASP-NDC-HCPCS-Crosswalk.zip 我已经知道了如何单独下载这些文件并解压缩它们,然后读取其中包含的XLS文件,但我希望将来能有一种更优雅或可扩展的方式来实现这一点

目前我的代码如下所示:

#DEFINE THE MONTHS OF THE FILES WE WANT TO RETRIEVE
months <- c("January", "April", "July", "Oct")

#FIND THE URLS OF THE FILES WE NEED
urls <- sprintf("https://www.cms.gov/Medicare/Medicare-Fee-for-Service-Part-B-Drugs/McrPartBDrugAvgSalesPrice/Downloads/%s-2019-ASP-NDC-HCPCS-Crosswalk.zip", months)

#DOWNLOAD FILES IF THEY DO NOT EXIST (https://nicercode.github.io/guides/repeating-things/)
download.maybe <- function(urls, refetch=FALSE, path = ".") {
  dest <- file.path(path, basename(urls))
  if (refetch || !file.exists(dest))
    download.file(urls, dest)
  dest
}

path <- "data"
dir.create(path, showWarnings = FALSE)
files <- sapply(urls, download.maybe, path=path)

我可以传递一个通配符,比如如果它包含2018年或2019年以及1月*、Ap*、7月*、10月*,然后下载文件,而不是将月份传递给sprintf吗?

一种方法可以是刮取您想要的页面。我们可以获取页面上的所有href属性,只选择以zip结尾的属性,然后使用download.file下载所有属性

url <- "https://www.cms.gov/Medicare/Medicare-Fee-for-Service-Part-B-Drugs/McrPartBDrugAvgSalesPrice/2018ASPFiles.html"
library(rvest)


all_urls <- url %>%
             read_html() %>%
             html_nodes("a") %>%
             html_attr("href") %>%
             grep("HCPCS-Crosswalk\\.zip$", ., value = TRUE)
             paste0("https://www.cms.gov", .)


lapply(all_urls, function(x) download.file(x, basename(x)))

我想这样的模式会得到你想要的:1月| 7月| 4月| 10月.-\\d{4}\\d{4}-1月| 7月| 4月| 10月.*+HCPCS人行横道.zip。。。也就是说,除非我在链接页面上的可下载文件中遗漏了什么,否则你只需要包含HCPCS-Crosswalk.zip的文件,不是吗?在这种情况下,这是您真正需要检查的唯一模式。此外,我不太确定是您遇到问题的模式匹配,还是“从网页获取URL”组件。@Hayden Y。感谢您的回复,是的,我只是在寻找HCPCS-Crosswalk.zip文件,但从2018年开始。如何将其合并到URL块中?可能需要阅读源页面并应用类似于//a/@href[contains.,'NDC HCPCS Crosswalk.zip']的XPath注意页面上还有其他zip文件,因此我将grep\\\\.zip$,,value=TRUE更改为grepHCPCS Crosswalk\\.zip,,,value=TRUE