从Web到R读取文件名列表

从Web到R读取文件名列表,第1张

概述我试图从网站上读取很多csv文件到R中. Threa是每日(仅限工作日)文件的多年.所有文件都具有相同的数据结构.我可以使用以下逻辑成功读取一个文件: # enter user credentialsuser <- "JohnDoe"password <- "SecretPassword"credentials <- paste(user,":",password,"@",sep=" 我试图从网站上读取很多csv文件到R中. Threa是每日(仅限工作日)文件的多年.所有文件都具有相同的数据结构.我可以使用以下逻辑成功读取一个文件:

# enter user credentialsuser     <- "JohnDoe"password <- "SecretPassword"credentials <- paste(user,":",password,"@",sep="")web.site <- "downloads.theice.com/Settlement_Reports_CSV/Power/"# construct path to datapath <- paste("https://",credentials,web.site,sep="")# read data for 4/10/2013file  <- "icecleared_power_2013_04_10"fname <- paste(path,file,".dat",sep="")df <- read.csv(fname,header=TRUE,sep="|",as.is=TRUE)

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

下面的插入内容显示了Web浏览器中文件列表的外观:



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

任何指导将不胜感激?

解决方法 我首先尝试抓取相关数据文件的链接,并使用生成的信息构建包含用户登录等的完整下载路径.正如其他人所建议的那样,lapply可以方便批量下载.

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

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

> 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.delim或read.csv或其他可读取的数据,类似于@Andreas所建议的.我说更安全,因为它可以提供更多的灵活性,以防文件没有完全下载等等.在这种情况下,您只需要下载未完全下载的文件,而不必重新下载所有内容.

总结

以上是内存溢出为你收集整理的从Web到R读取文件名列表全部内容,希望文章能够帮你解决从Web到R读取文件名列表所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1080142.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存