我可以连续读取一个文件而不必倒回到R的开头吗?

时间:2013-12-05 21:21:13

标签: r

你好专家,

我试图在10000行的连续块中读取一个大文件。这是    因为文件太大而无法立即读入。 read.csv的“skip”字段出现在    方便完成这项任务(见下文)。但是我注意到程序启动了    减慢到文件的末尾(对于i的大值)。    我怀疑这是因为每次调用read.csv(file,skip = nskip,nrows = block)总是如此    从头开始读取文件,直到所需的起始行“跳过”为止    到达。随着我的增加,这变得越来越耗时。    问题:有没有办法从最后一个位置开始继续读取文件    在上一个街区达成了?

    numberOfBlocksInFile<-800
    block<-10000
for ( i in 1:(n-1))
{

            print(i)
    nskip<-i*block

    out<-read.csv(file,skip=nskip,nrows=block)
    colnames(out)<-names

            .....
            print("keep going")

    }

many thanks (:-

2 个答案:

答案 0 :(得分:1)

一种方法是将readLines与文件连接一起使用。例如,你可以这样做:

temp.fpath <- tempfile() # create a temp file for this demo
d <- data.frame(a=letters[1:10], b=1:10) # sample data, 10 rows. we'll read 5 at a time
write.csv(d, temp.fpath, row.names=FALSE) # write the sample data
f.cnxn <- file(temp.fpath, 'r') # open a new connection

fields <- readLines(f.cnxn, n=1) # read the header, which we'll reuse for each block
block.size <- 5

repeat { # keep reading and printing 5 row chunks until you reach the end of the cnxn.
    block.text <- readLines(f.cnxn, n=5) # read chunk
    if (length(block.text) == 0) # if there's nothing left, leave the loop
        break

    block <- read.csv(text=c(fields, block.text)) # process chunk with
    print(block)
}

close(f.cnxn)
file.remove(temp.fpath)

答案 1 :(得分:0)

另一种选择是使用fread包中的read.table

N <- 1e6   ##  1 second to read 1e6 rows/10cols
skip <- N
DT <- fread("test.csv",nrows=N)
repeat {
  if (nrow(DT) < N) break
  DT <- fread("test.csv",nrows=N,skip=skip)
  ## here use DT for your process
  skip <- skip + N
}