如何将许多csv文件组合成一个大型csv而不将整个对象保存在RAM中

时间:2015-11-19 13:29:29

标签: r

我正在努力将csv文件合并到一个大的csv文件中,该文件无法容纳到我的机器的RAM中。无论如何要在R中这样做吗?我意识到我可以将每个单独的csv文件加载到R中并将该文件附加到现有的数据库表中,但出于奇怪的原因,我希望最终得到一个大的csv文件。

3 个答案:

答案 0 :(得分:2)

尝试逐个阅读每个csv文件,并使用write.table和选项append = T写出来。

这样的事情:

  1. 读取一个csv文件;
  2. write.table(..., append = T)到最终的csv文件;
  3. 使用rm();
  4. 删除该表格
  5. gc()
  6. 重复直到写完所有文件。

答案 1 :(得分:1)

您可以使用选项append = TRUE

first <- data.frame(x = c(1,2), y = c(10,20))
second <- data.frame(c(3,4), c(30,40))
write.table(first, "file.csv", sep = ",", row.names = FALSE)
write.table(second, "file.csv", append = TRUE, sep = ",", row.names = FALSE, col.names = FALSE)

答案 2 :(得分:0)

首先创建3个测试文件,然后创建一个包含其名称的变量Files。我们使用Sys.glob来获取文件名的向量,但您可能需要修改此语句。然后将outFile定义为输出文件的名称。对于Files的每个组件,使用该名称读取并写出来。如果它是第一个文件,则将其全部写出来,如果它是后续文件,则将其全部写入,但标题必须使用append = TRUE。请注意,每次读入文件时都会覆盖L,以便一次只占用一个文件空间。

# create test files using built in data frame BOD
write.csv(BOD, "BOD1.csv", row.names = FALSE)
write.csv(BOD, "BOD2.csv", row.names = FALSE)
write.csv(BOD, "BOD3.csv", row.names = FALSE)

Files <- Sys.glob("BOD*.csv") # modify as appropriate
outFile <- "out.csv"

for(f in Files) { 
  L <- readLines(f)
  if (f == Files[1]) cat(L, file = outFile, sep = "\n") 
  else cat(L[-1], file = outFile, sep = "\n", append = TRUE)
}

# check that the output file was written properly
file.show(outFile)

循环可以替换为:

for(f in Files) { 
  d <- read.csv(f)
  first <- f == Files[1]
  write.table(d, outFile, sep = ",", row.names = FALSE, col.names = first, append = !first)
}