我正在使用groovy,我正在尝试在特定行更改文本文件,而不会遍历所有前面的行。有没有办法说明你想要改变的文本文件的行?
例如
文本文件是:
1
2
3
4
5
6
我想说
Line(3) = p
并将文本文件更改为:
1
2
p
4
5
6
我不想做一个循环遍历行来改变值,也就是说我不想使用.eachline {line - > ...}方法。
提前谢谢,我真的很感激!
答案 0 :(得分:2)
我认为你不能像这样跳过线和遍历。您可以使用java中的Random Access File来跳过,但不应该使用行来指定字节数。
答案 1 :(得分:1)
尝试在文件文本上使用readLines()
。它会将所有行存储在列表中。要更改第n行的内容,请更改列表中n-1索引的内容,然后加入列表项。
像这样的东西会做
//We can call this the DefaultFileHandler
lineNumberToModify = 3
textToInsert = "p"
line( lineNumberToModify, textToInsert )
def line(num , text){
list = file.readLines()
list[num - 1] = text
file.setText(list.join("\n"))
}
编辑:对于超大型文件,最好有自定义实现。可能是蒂姆耶茨在你的问题评论中提出的建议。 上面的readLines()可以在不到一秒的时间内轻松处理多达100000行文本。所以你可以这样做:
if(file size < 10 MB)
use DefaultFileHandler()
else
use CustomFileHandler()
//CustomFileHandler
- Split the large file into buckets of acceptable size.
- Ex: Bucket 1(1-100000 lines), Bucket 2(100000-200000 lines), etc.
- if (lineNumberToModify falls in bucket range)
insert into line in the bucket
没有严格的规则来定义如何实现CustomFileHandler,因为它完全取决于用例场景。如果需要在同一文件上多次执行上述操作,可以选择先完成整个存储分区,将其存储在内存中,并使用存储区进行以下操作。或者,如果是一次性操作,您可以避免先操作所有存储桶,但只处理您需要的存储,并在以后按需处理其他存储桶。
即使在水桶中,您也可以定义自己的智能来加速工作。假如你想插入1-199000行的99999行,你可以充分利用groovy的方法和闭包,
file.readLines().reverse()[1] = "some text"