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"