从大文件中按编号读取行

时间:2011-08-23 05:47:37

标签: r large-files line-numbers

我有一个包含1500万行的文件(不适合内存)。我还有一个小的行号矢量 - 我要提取的行。

如何一次性读出行?

我希望有一个C函数可以一次完成它。

5 个答案:

答案 0 :(得分:25)

诀窍是使用连接并在read.table之前打开它:

con<-file('filename')
open(con)

read.table(con,skip=5,nrow=1) #6-th line
read.table(con,skip=20,nrow=1) #27-th line
...
close(con)

你也可以尝试scan,它更快,并提供更多控制。

答案 1 :(得分:5)

如果是二进制文件

有些讨论在这里: Reading in only part of a Stata .DTA file in R

如果是CSV或其他文本文件

如果它们是连续的并位于文件顶部,只需使用,nrows参数read.csv或任何read.table系列。如果没有,您可以组合,nrows,skip参数重复调用read.csv(在每次调用时读入新行或一组连续行),然后rbind结果一起。

答案 2 :(得分:4)

如果您的文件有固定的行长度,那么您可以使用“搜索”跳转到任何字符位置。所以只需要为你想要的每个N跳到N * line_length,然后读一行。

然而,来自R docs:

 Use of seek on Windows is discouraged.  We have found so many
 errors in the Windows implementation of file positioning that
 users are advised to use it only at their own risk, and asked not
 to waste the R developers' time with bug reports on Windows'
 deficiencies.

您也可以在C中使用标准C库中的“搜索”,但我不知道上述警告是否也适用!

答案 3 :(得分:3)

在我能够获得R解决方案/答案之前,我已经在Ruby中完成了它:

#!/usr/bin/env ruby

NUM_SEQS = 14024829

linenumbers = (1..10).collect{(rand * NUM_SEQS).to_i}

File.open("./data/uniprot_2011_02.tab") do |f|
  while line = f.gets
    print line if linenumbers.include? f.lineno 
  end
end

快速运行(我的存储可以读取文件的速度一样快)。

答案 4 :(得分:2)

我根据讨论here编译了一个解决方案。

scan(filename,what=list(NULL),sep='\n',blank.lines.skip = F)

这只会显示行数,但不会读取任何内容。如果你真的想跳过空白行,你可以将最后一个参数设置为TRUE。