【发布时间】:2015-11-19 23:35:15
【问题描述】:
我正在将 csv 文件合并为一个无法放入我机器 RAM 的大型 csv 文件。无论如何要在R中这样做吗?我意识到我可以将每个单独的 csv 文件加载到 R 中并将文件附加到现有的数据库表中,但出于古怪的原因,我希望最终得到一个大的 csv 文件。
【问题讨论】:
标签: r
我正在将 csv 文件合并为一个无法放入我机器 RAM 的大型 csv 文件。无论如何要在R中这样做吗?我意识到我可以将每个单独的 csv 文件加载到 R 中并将文件附加到现有的数据库表中,但出于古怪的原因,我希望最终得到一个大的 csv 文件。
【问题讨论】:
标签: r
尝试逐个读取每个 csv 文件,并使用write.table 和选项append = T 写出。
类似这样的:
write.table(..., append = T) 到最终的 csv 文件;rm()的表;gc()。重复直到所有文件都写完。
【讨论】:
您可以使用选项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)
【讨论】:
首先创建 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)
}
【讨论】: