1

私はgroovyを使用しており、前のすべての行をループせずに、特定の行でテキストファイルを変更しようとしています。変更したいテキストファイルの行を指定する方法はありますか?

例えば

テキストファイルは次のとおりです。

1
2
3
4
5
6

言いたい

Line(3) = p

テキストファイルを次のように変更します。

1
2
p
4
5
6

値を変更するために行を反復処理するためにループを実行する必要はありません。つまり、.eachline {line ->...} メソッドを使用したくありません。

よろしくお願いします。

4

2 に答える 2

2

このように行をスキップしてトラバースできるとは思いません。Java でRandom Access Fileを使用してスキップできますが、行の代わりにバイト数を指定する必要があります。

于 2012-07-24T05:50:01.427 に答える
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 行のテキストを 1 秒以内に簡単に処理できます。したがって、次のようなことができます。

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 回限りの操作の場合は、最初にすべてのバケットを操作することを避け、必要なものだけを処理し、後でオンデマンド ベースで処理することができます。

また、バケット内でも独自のインテリジェンスを定義して、ジョブを高速化できます。たとえば、1 ~ 100000 行のバケットの 99999 行に挿入する場合、groovy のメソッドとクロージャーを最大限に活用できます。

file.readLines().reverse()[1] = "some text" 
于 2012-07-24T06:03:51.567 に答える