【问题标题】:How to read and delete a specific row from a large file with R如何使用 R 从大文件中读取和删除特定行
【发布时间】:2013-06-18 13:43:30
【问题描述】:

一个大文件的前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 函数可用于读取删除大文件中的特定行。谢谢。

【问题讨论】:

  • 如何在循环中逐行读取并在线写入文件。在这种情况下,您将能够删除所有不需要的行。
  • 我的理解是否正确,您想删除一行而不读取/写入整个文件?我相信有比 R 更合适的工具。
  • 为什么要使用R 进行文件编辑功能?如果这就是你所做的一切,最好使用一些 shell 命令或你选择的文本编辑器。

标签: r


【解决方案1】:

如果你只想读取文件,那么使用scan 怎么样?它有一个skip 和一个nlines 参数。

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

我不确定是否要删除。通常使用 R,一切 都是可能的,但我认为如果你想拥有原始文件的完整副本 sans 您所指的特定行。

【讨论】:

  • 读取问题解决了,但是删除问题没有解决
  • @user2405694 确实如此。我认为 R 不适合/不能解决您的第二个功能(正如其他评论员所指出的那样)
  • @SimonO101 ,我是“评论者”而不是“评论者”:-)
  • @CarlWitthoft 哎呀。也许你可以两者兼而有之!
【解决方案2】:

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

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

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

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 转换成的相同文本格式中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2022-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多