25

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

我怎样才能一次读出这些行?

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

4

5 回答 5

26

诀窍是使用连接并在之前打开它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,它更快并且提供更多控制。

于 2011-08-23T06:32:13.693 回答
5

如果是二进制文件

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

如果是 CSV 或其他文本文件

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

于 2011-08-23T05:51:05.420 回答
4

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

但是,来自 R 文档:

 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 库中的 'seek',但我不知道上述警告是否也适用!

于 2011-08-23T09:33:54.317 回答
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

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

于 2011-08-23T06:17:00.323 回答
2

我根据此处的讨论编译了一个解决方案。

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

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

于 2016-10-09T13:46:17.173 回答