2017-01-28 54 views
0

У меня есть что-то вроде:Как найти количество строк и различных элементов в файле и их записи на заголовок, Scala

object Example_01_IO { 

    val s = Source.fromFile("example_01.txt") 
    val source = s.getLines() 
    val destination = new PrintWriter(new File("des_example_01.txt")) 

    var nrVariables: Int = 0 
    var nrLines: Int = 0 

    // here are the extracted lines from example_01 that fulfills some conditions. 
    val linesToWrite: Iterator[String] = ... 

    def main(args: Array[String]): Unit = { 

    //Here is the header that I want to write in a destination file 
    destination.write("des_example_01.txt \n") 
    destination.write("Nr. of Variables and Lines: " + nrVariables + " " + nrLines + "\n") 

    for(line <- linesToWrite) { 
     println(line) 
     destination.write(line) 
     destination.write("\n") 
     nrLines += 1 
    } 

    s.close() 
    destination.close() 

    } 

мне нужно иметь значения для nrVariables и nrLines писать в заголовке файла назначения (например, во второй строке). Есть ли возможность вычислить эти два значения, прежде чем начинать писать другие строки?

Любая помощь или ссылка действительно приветствуется. Спасибо.

+0

Похоже, домашнее задание). Вы должны либо сохранить linesToWrite в List (просто вызвать toList в источнике), чтобы вы могли повторно использовать его или дважды прочитать файл. – vitalii

+0

@vitalii, домашнее задание? Я закончил univ. в течение 10 лет. Я сохранил их в списке, и я пробовал так много трюков. Когда я дважды читаю файл, я получаю либо количество строк и переменных, либо строк, но не обоих. И я не знаю, что заставляет это случиться. – user4712458

ответ

0

Ну, Source.fromFile не могут быть повторно использованы, один ниже работает отлично:

package example 

import java.io.PrintWriter 
import scala.io.Source 
import java.io.File 

object Example_01_IO { 

    def s = Source.fromFile("/tmp/example_01.txt") // notice def everywhere, looks like Source.fromFile could not be reused :(
    def source = s.getLines() 
    val destination = new PrintWriter(new File("/tmp/des_example_01.txt")) 

    var nrVariables: Int = 0 
    var nrLines: Int = 0 

    // here are the extracted lines from example_01 that fulfills some conditions. 
    def linesToWrite: Iterator[String] = source.filter { s => s.contains("a") } 

    def main(args: Array[String]): Unit = { 

    linesToWrite.foreach { s => 
     nrLines += 1 
     if (s contains "variable") { 
     nrVariables += 1 
     } 
    } 


    //Here is the header that I want to write in a destination file 
    destination.write("des_example_01.txt \n") 
    destination.write("Nr. of Variables and Lines: " + nrVariables + " " + nrLines + "\n") 

    for(line <- linesToWrite) { 
     println(line) 
     destination.write(line) 
     destination.write("\n") 
     /*nrLines += 1*/ 
    } 

    s.close() 
    destination.close() 

    } 
    } 
+0

о, правда? Я общаюсь с этим в течение 2 дней :(Я не знал, что 'Source.fromFile не может быть повторно использован'. (Before) Я попытался изменить только' val linesToWrite = ... 'в' def linesToWrite = ... 'и это не было функционально. Я не знаю, что сказать иначе, кроме« Спасибо, сэр! ». – user4712458