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