Последняя строка файла в Groovy - PullRequest
1 голос
/ 01 ноября 2011

Судя по моим исследованиям, чтение последней строки текстового файла кажется сложным.У меня есть текстовый файл, который по существу состоит из блоков строк, каждый блок отделен пустой строкой.Я написал Groovy-скрипт, который может распознавать каждый блок по пустой строке после него.Я пытаюсь сосчитать абзацы.

Моя проблема в том, что за моим последним блоком не следует пустая строка (эти блоки генерируются другой программой, а не просто набираемые мной файлы)

Я думал, что мог бы обойти эту проблему «прочитать последнюю строку файла», просто добавив пустую строку в конец моего файла, а затем запустив свой сценарий.Это умно, или это так же сложно, как читать последнюю строку?

Если бы это могло сработать, как мне это сделать?

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Насколько я могу судить, у вас есть 2 варианта.

Если вы можете загрузить весь файл в память, вы можете сделать что-то вроде:

int countBlocksInMem( File f ) {
  f.readLines().with { lines ->
    int size = lines.grep { it == '' }.size()
    if( lines[ -1 ] != '' ) size++
    size
  }
}

Если он слишком велик для загрузки в память, вы можете сделать:

int countBlocks( File f ) {
  String lastLine
  int size = 0
  f.eachLine { line ->
    lastLine = line
    if( !line ) size++
  }
  if( lastLine ) size++
  size
}

Оба метода в основном суммируют количество пустых строк, и, если последняя строка в файле не пуста, увеличьте счетчик на 1

Изменить после полного изменения вопроса

Чтобы добавить пустую строку в файл, вы можете просто сделать:

new File( 'file.txt' ) << '\n'

Или с писателем

new File( 'file.txt' ).withWriterAppend {
  it.writeLine()
}

Конечно, если у вас есть несколько вещей, записывающих в один и тот же файл одновременно, это просто создаст беспорядок

0 голосов
/ 23 сентября 2016

Это первое попадание в Google для последней строки файла groovy. Для тех, кто ищет быстрый и простой способ получить последнюю строку :

    new(File("/home/user/somefile.txt").eachLine{
        if(it != null){
            lastLine = it
        }
    }

.eachLine выполняет итерацию по каждой строке текстового файла, а lastLine устанавливается в переменную it, пока не будетноль.Довольно просто

...