2014-12-01 12 views
0

Мне нужно прочитать файл строки за строкой, чтобы он читал первую строку, что-то делал с ней, затем берет вторую строку, что-то делает с ней и так далее.Как читать разные строки из текстового файла одновременно

Я знаю, как читать текстовый файл построчно:

for(line <- Source.fromFile("file.txt").getLines()) 
{ 
    insert(line) **Use the first line of the file in this function 
    reverse(line) **Use the second line of the file in this function 
} 

в функции вставки, сначала я хочу использовать первую строку файла, а в обратной функции Я хочу использовать вторая строка, затем во второй итерации цикла я хочу использовать 3-ю строку в функции вставки и 4-ю строку в обратной функции и так далее. Как это сделать?

EDIT: Это всего лишь пример. Мне нужна общая вещь, например, если я хочу использовать первую строку, вторую строку, третью строку и затем повторить цикл for, как это сделать?

ответ

0

Использование sliding, чтобы сгруппировать ваши строки в пары из двух.

for(pairs <- Source.fromFile("file.txt").getLines().sliding(2, 2)) { 
    insert(pairs.head) 
    reverse(pairs.last) 
} 

Очевидно, что вам нужно будет обработать условие, когда у вас нет списка четной длины.

+0

Я хочу сделать это в общем случае. Как это было всего лишь примером, когда мне нужна первая и вторая строки, а затем итерация цикла, предположим, что я хочу первую, вторую и третью строку, а затем итерацию, как это сделать? –

+0

Выяснил это! Спасибо всем :) –

2

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

for((line,index) <- Source.fromFile("file.txt").getLines().zipWithIndex) 
{ 
    if (index % 2 == 0) insert(line) 
    else reverse(line) 
} 
1

Еще один подход, использующий grouped, который принимает во внимание (возможно) нечетное количество строк,

Source.fromFile("file.txt") 
    .getLines 
    .grouped(2) 
    .map { xs => (xs.head, xs.last.reverse) } 

Обратите внимание, что getLines дает итератор для выборки по одной строке за один раз, последовательно, затем grouped дает еще один итератор с парными линиями для одновременный обработка. Это контрастирует с чтением нескольких строк файла одновременно.

+0

Я хочу сделать это в общем случае. Как это было всего лишь примером, когда мне нужна первая и вторая строки, а затем итерация цикла, предположим, что я хочу первую, вторую и третью строку, а затем итерацию, как это сделать? –

+0

Увеличьте значение 'Int' в' grouped', также 'xs.map {/ * удивительная обработка нескольких строк * /}' – elm

+0

Обратите внимание: если на входе нет четного количества строк, это дает исключение на «xs .последний". Это достаточно легко исправить, но беспорядочно с n> 2. Также исходный вопрос имел императивную структуру, которая имеет более функциональную структуру. Это можно исправить, заменив «.map {...}» на «.foreach {xs => {insert (xs.head), reverse (xs.last)}}". Опять же, ОП, возможно, просил функциональное преобразование. Сложно сказать. –