我有一个非常大的文件,我只需要第 1、100001、200001 行的第一个元素,我如下提取:
x1 <- read.csv(filename, nrows = 1, header = F)[1, 1]
x2 <- read.csv(filename, skip = 100000, nrows = 1, header = F)[1, 1]
x3 <- read.csv(filename, skip = 200000, nrows = 1, header = F)[1, 1]
我不知道阅读是如何进行的,但我认为这会迫使一些不必要的阅读/跳过。
我想知道我是否可以在阅读x2
后继续跳过,而不是再次从文件的开头开始。这会节省一些时间。
如果可以避免的话,我不想将整个文件(或整个第一列)保留在内存中(在某些时候)。
最佳答案
这是一种扫描
的方法。它假设您正在读取数字数据,如果不包括
what = character()
在对scan
的调用中。测试文件在最后。
请注意,我跳过了 10 行,而不是 1000 行。
fl <- "~/Temp/so.csv"
sep = ","
skip <- 10L
vec <- NULL
skp <- 0L
x <- scan(fl, sep = sep, n = 1L, nlines = 1L)
while(length(x) > 0L) {
vec <- c(vec, x)
skp <- skp + skip
x <- scan(fl, sep = sep, n = 1L, skip = skp, nlines = 1L)
}
vec
#> [1] 1 11 21 31
创建于 2023-06-08,使用 reprex v2.0.2
数据
这是测试文件的内容(40 行)。
1,a,21
2,b,22
3,c,23
4,a,24
5,b,25
6,c,26
7,a,27
8,b,28
9,c,29
10,a,30
11,b,31
12,c,32
13,a,33
14,b,34
15,c,35
16,a,36
17,b,37
18,c,38
19,a,39
20,b,40
21,c,41
22,a,42
23,b,43
24,c,44
25,a,45
26,b,46
27,c,47
28,a,48
29,b,49
30,c,50
31,a,51
32,b,52
33,c,53
34,a,54
35,b,55
36,c,56
37,a,57
38,b,58
39,c,59
40,a,60
关于r - 读取 csv 文件时多次跳过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76433056/