我正在努力将csv文件合并到一个大的csv文件中,该文件无法容纳到我的机器的RAM中。无论如何要在R中这样做吗?我意识到我可以将每个单独的csv文件加载到R中并将该文件附加到现有的数据库表中,但出于奇怪的原因,我希望最终得到一个大的csv文件。
答案 0 :(得分:2)
尝试逐个阅读每个csv文件,并使用write.table
和选项append = T
写出来。
这样的事情:
write.table(..., append = T)
到最终的csv文件; rm()
; gc()
。重复直到写完所有文件。
答案 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)
}