我试图从网站上读取很多csv文件到R中 . Threa是每日(仅限工作日)文件的多年 . 所有文件都具有相同的数据结构 . 我可以使用以下逻辑成功读取一个文件:
# 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浏览器中文件列表的外观:
...... ......
有没有办法扫描路径(从上面)获取目录中的所有文件名列表,首先满足certin crieteia(即以“icecleared_power_”开头,因为该位置的某些文件也有不同我不想读的起始名称然后循环read.csv通过该列表并使用rbind追加?
任何指导将不胜感激?
3 回答
我首先尝试抓取相关数据文件的链接,并使用生成的信息构建包含用户登录等的完整下载路径 . 正如其他人所建议的那样,
lapply
可以方便批量下载 .这是一种提取URL的简便方法 . 显然,修改示例以适合您的实际场景 .
在这里,我们将使用
XML
包来识别Amelia软件包(http://cran.r-project.org/src/contrib/Archive/Amelia/)的CRAN档案中可用的所有链接 .为了演示,想象一下,最终,我们只需要1.2版本软件包的链接 .
您现在可以使用该向量,如下所示:
更新(在评论中澄清您的问题)
上例中的最后一步将指定的文件下载到当前工作目录(使用
getwd()
来验证它在哪里) . 相反,如果你确定read.csv
对数据有效,你也可以尝试修改你的匿名函数来直接读取文件:但是,我认为更安全的方法可能是首先将所有文件下载到单个目录中,然后使用
read.delim
或read.csv
或其他任何工作来读取数据,类似于@Andreas所建议的 . 我说更安全,因为它可以提供更大的灵活性,以防文件没有完全下载等等 . 在这种情况下,您只需要下载未完全下载的文件,而不必重新下载所有内容 .@MikeTP,如果所有报告都以“icecleared_power_”开头,而日期是商业日期,则“timeDate”软件包提供了一种创建业务日期向量的简便方法,如下所示:
和
为您提供连接的文件名 .
如果网站遵循关于文件命名的不同逻辑,我们需要更多信息,如Ananda Mahto所观察到的那样 .
请记住,当您使用timeDate创建日期向量时,您可以比我的简单示例更复杂 . 您可以考虑假期时间表,证券交易所日期等 .
您可以尝试使用命令“download.file” .
解决这个问题的方法是弄清楚文件之间“url”或“path”如何系统地改变 . 通常,网页的构建使得“网址”是系统的 . 在这种情况下,您可以创建url的向量或数据框,以在apply函数内部进行迭代 .
所有这些都可以夹在“lapply”中 . “数据”对象就是我们迭代的任何东西 . 它可以是URL的矢量或年和月观察的数据帧,然后可以用于在“lapply”函数内创建URL .
然后,您可以使用“list.files()”将所有数据合并在一起,假设它们属于一个data.frame
有时,您会注意到文件在下载后已损坏 . 在这种情况下,请注意download.file()命令中包含的选项“mode” . 如果文件以二进制格式存储,则可以设置mode =“w”或mode =“wb” .