Scala - ReadLines с пониманием белья - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь читать из (\ n отделенного) файла в Scala.Я хотел бы относиться к последней и второй к последней строке файла в отличие от других.как мне этого добиться?Насколько я знаю, LineNumberedReader, который является BufferedReader, может получить текущий номер строки, но не знает об общем количестве строк (чтобы обработать последнюю строку по-другому).Требуется:

var aLine = lineNumberedReader.readLine
while (aLine != null) {
   val currentLineNum: Int = lineNumberedReader.getLineNumber
   if (currentLineNum == total_line_count - 1) {
       do_this // To know if its the last line/ second to last, I need the total_line_count available in hand. which I (maybe incorrectly?) believe needs a file iteration by itself
   } else {
       do_that
   }
   aLine = lineNumberedReader.readLine
}

Те же проблемы существуют с Scala io.Source.требуется минимум две итерации файла.Какие-нибудь идеи / API, с помощью которых это может быть достигнуто с помощью одной итерации?

EDIT : Расширить вопрос, включив регистр для второй до последней строки

1 Ответ

2 голосов
/ 11 марта 2019

Может быть, что-то вроде этого?

val lines = Source
  .fromFile("filename")
  .getLines
lines.foreach { line => 
   if (lines.hasNext) doThis(line) else doThat(line)
}

Для одного до последнего все становится более сложным:

val it = Source.fromFile("filename").getLines.sliding(2)
it.foreach { 
 case x :: _ if it.hasNext => doCommon(x) 
 case x :: y :: _ => doBeforeLast(x); doLast(y)
}

Или вообще для N-before-last (перед редактированиемопять твой вопрос: D):

val it = Source.fromFile("filename").getLines.sliding(n+1)
it.foreach {
  case x :: _ if it.hasNext => doCommon(x)
  case tail => doNBeforeLast(tail)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...