gpt4 book ai didi

从网络读取文件名列表到 R

转载 作者:行者123 更新时间:2023-12-04 18:10:09 24 4
gpt4 key购买 nike

我正在尝试从网站将大量 csv 文件读入 R。威胁是多年的日常(仅限工作日)文件。所有文件都具有相同的数据结构。我可以使用以下逻辑成功读取一个文件:

# enter user credentials
user <- "JohnDoe"
password <- "SecretPassword"
credentials <- paste(user,":",password,"@",sep="")
web.site <- "downloads.theice.com/Settlement_Reports_CSV/Power/"

# construct path to data
path <- paste("https://", credentials, web.site, sep="")

# read data for 4/10/2013
file <- "icecleared_power_2013_04_10"
fname <- paste(path,file,".dat",sep="")
df <- read.csv(fname,header=TRUE, sep="|",as.is=TRUE)

但是,我正在寻找有关如何一次读取目录中所有文件的提示。我想我可以生成一系列日期并在循环中构造上面的文件名并使用 rbind 附加每个文件,但这似乎很麻烦。另外,在没有文件的周末和节假日尝试阅读时会出现问题。

下图显示了文件列表在 Web 浏览器中的样子:

file list in browser part 1

...
...
...

file list in browser part 2

有没有办法扫描路径(从上面)以获取目录中所有文件名的列表,这些文件名首先满足 certin crieteia(即以“icecleared_power_”开头,因为该位置还有一些文件具有不同的我不想读入的起始名称)然后通过该列表循环 read.csv 并使用 rbind 附加?

任何指导将不胜感激?

最佳答案

我会首先尝试抓取相关数据文件的链接,并使用结果信息构建包含用户登录等的完整下载路径。正如其他人所建议的,lapply方便批量下载。

这是提取 URL 的简单方法。显然,修改示例以适合您的实际场景。

在这里,我们将使用 XML包以识别 Amelia 包的 CRAN 文件中的所有可用链接 (http://cran.r-project.org/src/contrib/Archive/Amelia/)。

> library(XML)
> url <- "http://cran.r-project.org/src/contrib/Archive/Amelia/"
> doc <- htmlParse(url)
> links <- xpathSApply(doc, "//a/@href")
> free(doc)
> links
href href href
"?C=N;O=D" "?C=M;O=A" "?C=S;O=A"
href href href
"?C=D;O=A" "/src/contrib/Archive/" "Amelia_1.1-23.tar.gz"
href href href
"Amelia_1.1-29.tar.gz" "Amelia_1.1-30.tar.gz" "Amelia_1.1-32.tar.gz"
href href href
"Amelia_1.1-33.tar.gz" "Amelia_1.2-0.tar.gz" "Amelia_1.2-1.tar.gz"
href href href
"Amelia_1.2-2.tar.gz" "Amelia_1.2-9.tar.gz" "Amelia_1.2-12.tar.gz"
href href href
"Amelia_1.2-13.tar.gz" "Amelia_1.2-14.tar.gz" "Amelia_1.2-15.tar.gz"
href href href
"Amelia_1.2-16.tar.gz" "Amelia_1.2-17.tar.gz" "Amelia_1.2-18.tar.gz"
href href href
"Amelia_1.5-4.tar.gz" "Amelia_1.5-5.tar.gz" "Amelia_1.6.1.tar.gz"
href href href
"Amelia_1.6.3.tar.gz" "Amelia_1.6.4.tar.gz" "Amelia_1.7.tar.gz"

为了演示起见,假设最终我们只需要 1.2 版本的包的链接。
> wanted <- links[grepl("Amelia_1\\.2.*", links)]
> wanted
href href href
"Amelia_1.2-0.tar.gz" "Amelia_1.2-1.tar.gz" "Amelia_1.2-2.tar.gz"
href href href
"Amelia_1.2-9.tar.gz" "Amelia_1.2-12.tar.gz" "Amelia_1.2-13.tar.gz"
href href href
"Amelia_1.2-14.tar.gz" "Amelia_1.2-15.tar.gz" "Amelia_1.2-16.tar.gz"
href href
"Amelia_1.2-17.tar.gz" "Amelia_1.2-18.tar.gz"

您现在可以按如下方式使用该向量:
wanted <- links[grepl("Amelia_1\\.2.*", links)]
GetMe <- paste(url, wanted, sep = "")
lapply(seq_along(GetMe),
function(x) download.file(GetMe[x], wanted[x], mode = "wb"))

更新(在评论中澄清您的问题)

上面示例中的最后一步将指定的文件下载到您当前的工作目录(使用 getwd() 来验证它的位置)。相反,如果您确定知道 read.csv处理数据,您也可以尝试修改匿名函数以直接读取文件:
lapply(seq_along(GetMe), 
function(x) read.csv(GetMe[x], header = TRUE, sep = "|", as.is = TRUE))

但是,我认为更安全的方法可能是先将所有文件下载到一个目录中,然后使用 read.delimread.csv或任何可以读取数据的方法,类似于@Andreas 的建议。我说更安全,因为它为您提供了更大的灵活性,以防文件未完全下载等。在这种情况下,您不必重新下载所有内容,而只需下载未完全下载的文件。

关于从网络读取文件名列表到 R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15954463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com