Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以连续读取文件而不必在R中倒回到开头吗?_R - Fatal编程技术网

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

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

各位专家

我试图在一个大文件中读取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 (:-

numberOfBlocksInFile一种方法是通过文件连接使用
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)

temp.fpath另一个选项是使用
fread
from
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
}

N您看到了吗,或者?连接可以这样运行,但是read.csv甚至read.table和scan会在终止时关闭它们的连接。我在?seek的帮助页面上发现了这条有趣的评论:“不鼓励在Windows上使用seek。我们在Windows文件定位的实现中发现了太多错误,建议用户使用seek的风险自负,并要求不要浪费R开发人员的时间来报告Windows的缺陷。”@dwn
read.csv
只关闭它打开的连接,所以请先打开它,如图所示。对不起。我无法以你所说明的方式连续阅读。读取一次后,连接被报告为“无效”。