0

一个大文件的前5行(共100万行)如下:

c6 c24 c32 c54 c67
c6 c24 c32 c51 c68 c78
c6 c32 c54 c67
c6 c32 c55 c63 c85 c94 c75
c6 c32 c53 c67

readLines()可以从第 1 行一次读取一行。当我想读取第 20001 行时,readLines()效率不高。是否可以使用 R 函数从大文件中读取删除特定行. 谢谢你。

4

2 回答 2

1

如果您只想读取文件,如何使用scanwhich 同时具有 askip和参数。nlines

scan( "myfile" , skip = 20000 , nlines = 1 )

但是,我不确定是否要删除。通常使用 R,一切皆有可能,但我认为,如果您想拥有原始文件的完整副本,则必须先读取整个文件,然后才能删除该行,而不是您所指的特定行。

于 2013-06-21T12:32:37.180 回答
0

两个条件: 1 这是问题提出后的几年;2 这仅适用于替换最后一行。尽管有第 2 点,但我认为可以对其进行修改以纠正除最后一行之外的特定行修改。

与使用大型数组需要时间的 read.table 和 write.table 不同,readLines 和 writeLines 似乎更有效。在下面的示例中,我删除了一个大数组的最后一行并将其替换为新文本。

通过创建一个大数组并保存为文件来设置示例:

write.table(
array(runif(1000000),dim=c(1000,1000)),
file="BigArray.r", row.names = FALSE, col.names = FALSE, sep = "\t")

使用 readLines 打开大数组文件,删除最后一行,然后重新写入。另外,使用 writeLines 添加新的最后一行:

time=proc.time()
BigArray=readLines("BigArray.r")
BigArray=BigArray[-length(BigArray)]
writeLines(BigArray,"BigArray.r",sep="\n")
write(seq(1,1000,1),ncolumns=1000,file="BigArray.r",append=TRUE,sep="\t")
proc.time()-time

user  system elapsed 
0.69    0.10    0.85 

这比替代方案表现更好:

time=proc.time()
BigArray=read.table("BigArray.r", sep = "\t")
BigArray[1000,]=seq(1,1000,1)
write.table(BigArray,file="BigArray.r", row.names = FALSE, col.names = FALSE, 
sep = 
"\t")
proc.time()-time

user  system elapsed 
3.62    0.11    3.75

有人可能能够更好地替换数组中间的特定行,但我无法将新行插入到 readLines 转换成的相同文本格式中。

于 2018-08-24T19:06:58.113 回答