时髦:从文件中读取一系列行

2022-09-04 00:41:55

我有一个文本文件,其中包含大约2,000,000行的大量数据。使用以下代码片段浏览文件很容易,但这不是我需要的;-)

def f = new File("input.txt")
f.eachLine() {
    // Some code here
}

我只需要从文件中读取特定范围的行。有没有办法像这样指定开始和结束行(伪代码)?我想避免在选择范围之前使用readLines()将所有行加载到内存中。

// Read all lines from 4 to 48
def f = new File("input.txt")
def start = 4
def end = 48
f.eachLine(start, end) {
    // Some code here
}

如果Groovy无法做到这一点,那么任何Java解决方案也受到欢迎:-)

干杯,罗伯特


答案 1

Java 解决方案:

BufferedReader r = new BufferedReader(new FileReader(f));
String line;
for ( int ln = 0; (line = r.readLine()) != null && ln <= end; ln++ ) {
    if ( ln >= start ) {
        //Some code here
    }
}

格罗斯,嗯?

不幸的是,除非您的行是固定长度,否则您将无法有效地跳到第三行,因为每行都可以任意长,因此需要读取所有数据。不过,这并不排除一个更好的解决方案。start

爪哇 8

认为值得更新以展示如何使用Streams有效地做到这一点:

int start = 5;
int end = 12;
Path file = Paths.get("/tmp/bigfile.txt");

try (Stream<String> lines = Files.lines(file)) {
    lines.skip(start).limit(end-start).forEach(System.out::println);
}

由于流是懒惰地评估的,因此它只会读取行,直到并包含(加上它选择执行的任何内部缓冲)。end


答案 2

这是一个时髦的解决方案。不幸的是,这将读取文件的每一行start

def start = 4
def end = 48

new File("input.txt").eachLine(start) {lineNo, line ->

    if (lineNo <= end) {
        // Process the line
    }
}