如何在R中逐行写入文件

4
我正在尝试逐行读取csv文件,并仅选择左侧第二个和第三个单元格以及右侧第三个单元格。例如,如果此行中有17个单元格,则我将取第15个单元格。然后,我想通过逗号将这3个单元格组合在一起,然后将此行写入新的csv文件。
目前,我只是使用for循环访问每一行,然后按逗号拆分它们。然后我选择我想要的单元格并将它们组合成一个字符串并附加到一个大的字符串变量中。一旦for循环完成,我通过writeLines()写出文件。但是,由于有280万行,所以这个过程需要很长时间并且需要大量内存。有没有更有效的方法?或者我能否在for循环中逐行写入输出文件?
FileLinebyLine <- read_lines("testfile.csv")

pt<-proc.time()
NewFile <- ""
RowList <- list()
for (i in 1:length(FileLinebyLine))
{
    a <- strsplit(FileLinebyLine[i],",")
    RowList[i] = paste(a[[1]][2],a[[1]][3],a[[1]][(length(a[[1]]) - 2)], sep = ",")

}
NewFile <- paste(unlist(RowList), sep = "\n")
proc.time()-pt
outputfile <- file("output.txt")
writeLines(NewFile,outputfile)
close(outputfile)

我也尝试在for循环中使用write_lines(),但总是出现错误信息"isOpen(path) : invalid connection"。有人可以帮忙吗?非常感谢!


2
R不是这种方法的好工具。如果您的数据无法放入内存中,我建议您使用命令行工具,如sedawk。如果您的数据可以放入内存中,则在R中一次性读取整个数据框(或以500k行批次),选择所需列,然后一次性写出输出将会更快。 - Gregor Thomas
1个回答

3

是的,你可以逐行读写,但我不知道速度会有多快。以下是一个示例,它逐行读取文件的每一行中的第4个项目,并将其逐行写入新文件:

con = file("temp.csv", "r")
while(length(x <- readLines(con, n = 1)) > 0) {
    write(strsplit(x,",")[[1]][4], file="out.csv", append=T)
}
close(con)

temp.csv

a,b,c,d,e,f,g,h
x,y,z,a,b,c,d,e
1,2,3,4,5,6,7,8
q,w,e,r,t,y,u,i

out.csv

d
a
4
r

希望这能帮到你。编辑:你还可以添加library(compiler); enableJIT(3)以稍微加快循环速度。

非常感谢您! - Mars Chen
谢谢!如果有帮助,请选择并标记为答案。 - thc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接