2014-12-01 188 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 
} 

,首先我要使用该文件的第一行,并在反向功能我想使用第二行,然后在循环的第二次迭代中,我想在插入函数中使用第三行,在反向函数中使用第四行等等。怎么做?

编辑:这只是一个例子。我想要一个普通的东西,比如假设我想要使用第一行,第二行,第三行然后遍历for循环,该怎么做?

回答

0

使用sliding将您的行分成两对。

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

显然,你需要处理,你甚至没有长度的列表的条件。

+0

我想使它成为一般情况。就像这只是一个例子,我想要第一和第二行,然后循环迭代,假设我想要第一,第二和第三行,然后迭代,如何做到这一点? – 2014-12-02 08:20:44

+0

想通了!谢谢所有:) – 2014-12-02 14:47:41

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

我想使它成为一般情况。就像这只是一个例子,我想要第一和第二行,然后循环迭代,假设我想要第一,第二和第三行,然后迭代,如何做到这一点? – 2014-12-02 08:19:38

+0

在'grouped'中增加'Int'的值,并且'xs.map {/ * awesome multiple lines processing * /}' – elm 2014-12-02 08:30:40

+0

注意,如果输入没有偶数行,那么这会给出“xs 。持续”。修复起来很容易,但是n> 2很麻烦。原来的问题也有命令式的结构,它有更多的功能结构。这可以通过用“.foreach {xs => {insert(xs.head),reverse(xs.last)}}”替换“.map {...}”来解决。再次,OP可能一直在要求进行功能转换。很难说。 – 2014-12-02 16:46:51

相关问题