Нужен лучший способ для итерации файла, возвращающего пакеты строк в виде XML - PullRequest
0 голосов
/ 23 мая 2011

Я ищу лучший способ обработки файла, в котором, основываясь на содержимом, я объединяю определенные строки в XML и возвращаю XML.

например, учитывая

line 1
line 2
line 3
line 4
line 5

Я могу захотеть, чтобы первый вызов возвратил

<msg>line 1, line 2</msg>

, а последующий вызов вернул

<msg>line 5, line 4</msg>

, пропустив строку 3 для неинтересного контента и исчерпав поток ввода.(Примечание: теги <msg> всегда будут содержать смежные строки, но число и организация этих строк в XML будут различаться.) Если вы хотите, чтобы некоторые критерии выбора строк включались в сообщение, предположим, что нечетные строки #s объединяютсо следующими четырьмя строками четные строки # объединяются со следующими двумя строками, mod (10) строки # объединяются со следующими пятью строками, пропуская строки, начинающиеся с «#».

Я думал, что ядолжен реализовать это как итератор, чтобы я мог просто сделать

<root>{ for (m <- messages(inputstream)) yield m }</root>

Это разумно?Если так, то как лучше это реализовать?Если нет, то как лучше это реализовать?:)

Спасибо

1 Ответ

0 голосов
/ 24 мая 2011

Этот ответ дал мое решение: Как вы возвращаете Итератор в Scala?

Я попробовал следующее, но, похоже, возникла какая-то проблема с буфером, и между вызовами пропускаются строкина Log.next.

class Log(filename:String) {

  val src = io.Source.fromFile(filename)
  var node:Node = null

  def iterator = new Iterator[Node] {
    def hasNext:Boolean = {
      for (line <- src.getLines()) {
        // ... do stuff ...
        if (null != node) return true
      }
      src.close()
      false
    }

  def next = node
}

Может быть, есть и более Scala-способ сделать это, и я бы хотел это увидеть, но это мое решение, чтобы двигаться вперед.

...