在groovy中的特定文本文件行开始循环

时间:2012-07-24 05:09:09

标签: groovy io

我正在使用groovy,我正在尝试在特定行更改文本文件,而不会遍历所有前面的行。有没有办法说明你想要改变的文本文件的行?

例如

文本文件是:

1
2
3
4
5
6

我想说

Line(3) = p

并将文本文件更改为:

1
2
p
4
5
6

我不想做一个循环遍历行来改变值,也就是说我不想使用.eachline {line - > ...}方法。

提前谢谢,我真的很感激!

2 个答案:

答案 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"