我正在尝试逐行读取 csv 文件,只选择左侧的第二个和第三个单元格,以及右侧的第三个单元格。例如,如果这一行有 17 个单元格,我将取第 15 个单元格。然后我想组合这 3 个单元格,用逗号分隔,然后将此行写入一个新的 csv 文件。
现在,我只是使用 for 循环来访问每一行,然后用逗号分隔它们。然后我选择我想要的单元格并将它们组合为一个字符串并附加到一个大的 String 变量。 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() 但它总是给我错误 Error in
isOpen(path) : 无效连接
谁能帮我?感谢!!!
最佳答案
是的,你可以一行一行地读写,虽然我不知道它会多快。这是一个逐行读取文件的示例,每行中的第 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)
临时文件
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
输出.csv
d
a
4
r
希望有帮助。
编辑:您还可以添加
library(compiler); enableJIT(3)
稍微加快你的循环。
关于r - 如何在R中逐行写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45046184/