2013-08-12 2 views
1

Я хотел бы прочитать большой текстовый файл, содержащий два столбца целых чисел. Для каждого последовательного растяжения, где первый столбец является постоянным, я хочу собрать второй столбец в виде списка. В качестве примера, следующий примерЧтение коллекции списков из файла в scala

1 2 
1 1 
1 2 
4 3 
4 8 
1 5 
8 2 
8 2 
8 7 

должен производить списки

2,1,2 
3,8 
5 
2,2,7 

Что такое правильный способ для достижения этой цели в Scala?

В частности, было бы очень приятно иметь «ленивое» решение, чтобы я мог обрабатывать каждый список, не загружая весь файл в первую очередь.

ответ

1
val nums = """(\d+) (\d+)""".r 

val tuples = io.Source.fromFile("list.txt").getLines collect { 
    case nums(label, num) => (label.toInt -> num.toInt) 
} 

def toList(tuples: Iterator[(Int, Int)]): Iterator[Seq[Int]] = { 
    if(!tuples.hasNext) Iterator.empty 
    else { 
    val (label, num) = tuples.next 
    val (succ, rest) = tuples.span(_._1 == label) 
    Iterator(num :: succ.map(_._2).toList) ++ toList(rest) 
    } 
} 

toList(tuples)foreach(println) 
1

Самый простой способ - использовать файл scala.io.Source, чтобы прочитать файл по строкам. С getLines, вы можете извлечь Iterator[String], по которому вы можете карту, чтобы разделить строки и преобразовать их в Интс так:

val intPairs = Source.fromFile("/path/to/file").getLines.map { line => 
    line.split(" ").take(2).map(_.toInt) 
} 

Я оставляю группировку последовательных линий в качестве упражнения для вас.

Смежные вопросы