ReadLines在R中使用多个源

时间:2017-03-27 16:39:46

标签: r loops csv web-scraping readlines

我正在尝试使用readLines()来抓取由Census托管的.txt文件,并将它们编译成一个.txt / .csv文件。我可以使用它来阅读单个页面,但我想拥有它以便我可以运行一个函数,它将基于带有URL的csv运行和readLines()。

我对循环和函数属性的了解不是很好,但这里是我试图合并的代码片段:

以下是我如何构建我可以添加到/和/或转换为csv的url矩阵,并让函数以这种方式读取它。

MasterList <- matrix( data = c("%20Region/ne0001y.txt", "%20Region/ne0002y.txt", "%20Region/ne0003y.txt"), ncol = 1)
urls <- sprintf("http://www2.census.gov/econ/bps/Place/Northeast%s", MasterList)

这是我开始写的功能(充满了问题):

Scrape <- function(x){
  for (i in x){
      URLS <- i
      headers <- readLines(URLS, n=2)
      bod <- readLines(URLS)
      bodclipped <- bod[-c(1,2,3)]
      Totes <- c(headers, bodclipped)
      write(Totes, file = "[Directory]/ScrapeTest.txt")
      return(head(Totes))
  }
}

这个想法是我会运行Scrape(urls),它会在我的“urls”矩阵/ csv中生成3个网址的累积,并且从第一个(标题除外)所有文件中删除了Census的内置标题与bodclipped)。

我尝试使用readLines对“urls”执行lapply(),但只生成基于最后一个url的文本,而不是全部三个,并且它们仍然有每个文本文件的标题,我可以删除然后重新附加最后。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

由于所有这些文件都是包含38列的csv个文件,因此您可以非常轻松地使用这些文件进行组合:

MasterList <- c("%20Region/ne0001y.txt", "%20Region/ne0002y.txt", "%20Region/ne0003y.txt")
urls <- sprintf("http://www2.census.gov/econ/bps/Place/Northeast%s", MasterList)

raw_dat <- lapply(urls, read.csv, skip = 3, header = FALSE)
dat <- do.call(rbind, dat_raw)

这里发生了什么,这是如何循环的? lapply函数基本上创建了一个包含3(= length(urls))个条目的列表,并用read.csv(urls[i], skip = 3, header = FALSE)填充它们。所以raw_dat是一个包含3个包含数据的data.frames的列表。 do.call(rbind, dat)将em绑定在一​​起。

标题行接缝以某种方式破坏了为什么我使用的skip = 3, header = FALSE相当于您的bod[-c(1,2,3)]

如果所有抓取的数据都适合内存,您可以这样组合它,最后使用以下方法将其写入文件:

write.csv(dat, "[Directory]/ScrapeTest.txt")