如何打开文件然后在循环中向其写入行

时间:2019-07-09 03:22:24

标签: r file

有很多R主题类似的帖子,但它们没有提供我想要的内容。

伪代码(这并不意味着是R),如下所示:

fileConn <- file("foo.txt")
for (i in 1:hiLimit) {
  # extract elements from each nested and variable json element in an R list.
  # paste elements into a comma separated list
  write(pastedStuff,fileConn)
}
close(fileConn)

现在,如果我跳过“文件”和“关闭”,而仅将“ cat”与文件名和“ append = TRUE”一起使用,如下所示:

cat(paste(cve,vndr,pnm,vnmbr,vaffct,sep=","),file="outfile.txt",append=TRUE,sep="\n")

我得到了我想要的。但是,大概这是为每个调用打开和关闭文件(假设)。避免这种情况会使其更快。

我无法解决的是如何通过psuedo代码中的方法获得结果,该方法仅打开和关闭文件一次。使用'cat'或'writeLines'只是给我文件的最后一行。

通过解释,我正在解决的问题涉及从头开始逐行构建数据帧。我的时间安排(请参阅下文)表明,到目前为止,我能做到的最快方法是将csv写入磁盘,然后再读回以创建数据帧。这太疯狂了,但这就是它的平移方式。

## Just the loop without any attempt to collect parsed data into a dataframe
system.time(tmp <- affectsDetails(CVEbase,Affect))
   user  system elapsed 
   0.30    0.00    0.29 

## Using rbind as in rslt<- rbind (rslt,c(stuff)) to build dataframe in the loop.
system.time(tmp <- affectsDetails(CVEbase,Affect))
   user  system elapsed 
 990.46    2.94  994.01 

# Preallocate and insert list as per 
# https://stackoverflow.com/questions/3642535/creating-an-r-dataframe-row-by-row
system.time(tmp <- affectsDetails(CVEbase,Affect))
   user  system elapsed 
1451.42    0.04 1452.37 

# Write to a file with cat and read back the csv.
system.time(tmp <- affectsDetails(CVEbase,Affect))
   user  system elapsed 
  10.70   29.00   45.42

任何建议表示赞赏!

1 个答案:

答案 0 :(得分:0)

不确定如何为您提供帮助。但是您可以打开一个连接并将其保持打开状态,直到写入完成。

testcon <- file(description = "C:/test.txt", open = "a")

isOpen(testcon)
[1] TRUE

start <- Sys.time()
for (i in 1:10000) {

 cat(paste0("hallo", i), file= testcon, append=TRUE,sep="\n")

}
end <- Sys.time()

end-start
Time difference of 0.2017999 secs

close(testcon)

似乎比以下速度快得多:

start <- Sys.time()
for (i in 1:10000) {

  cat(paste0("hallo", i), file= "C:/test.txt", append=TRUE,sep="\n")

}
end <- Sys.time()

end-start
Time difference of 3.382569 secs