2017-01-27 1 views
-1

Ich habe eine Datei, zum Beispiel wie folgt hinzuzufügen:Wie ein Element am Anfang einer Zeile in einer Datei in Scala

// file_1.txt 
10 2 3 
20 5 6 
30 8 9 

Ich brauche einen Brief mit einem Leerzeichen vor jeder Zeile zu schreiben, die erfüllt ein Kriterium in Bezug auf die ersten Wert/Nummer in der Linie, zum Beispiel, wenn ich den Wert 20 dann die Datei geben soll wie folgt aussehen:

// file_1.txt 
10 2 3 
c 20 5 6 
30 8 9 

Wie ich dies in Scala erreichen kann?

Das ist, was ich versuche, bis jetzt:

import java.io._ 
import scala.io.Source 

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")) 
    val toComment = Array(-10, 20, -30) 

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


    for (line <- source) { 
     //if(line_begins_with_any_value_from_toComments_then_write_a_"c"_infront_of_that_line){ 
     println(line) 
     destination.write("c" + line) 
     destination.write("\n") 
     //} 

    } 

    s.close() 
    destination.close() 

    } 
} 

ich in eine andere Datei schreiben kann, sagen wir mal, aber ich muss in der gleichen Datei schreiben, und nur dann, wenn eine Linie eine solche Bedingung erfüllt .

Ich würde jede Hilfe zu schätzen wissen.

+0

Mit welchen Problemen sind Sie bei der Implementierung selbst konfrontiert worden? – Dima

+0

Dies ist Off-Topic für SO. Sie haben wahrscheinlich mehr Glück auf Websites wie http://freelancer.com – Dima

+0

Ich machte eine Bearbeitung (siehe oben) auf, was ich versuche. Ich wollte die Frage einfach für jeden halten, der helfen kann (und nicht beleidigt zu werden. @ Dima). – user4712458

Antwort

0

Ausgehend von dem, was Sie haben, alles, was Sie wirklich hinzufügen müssen, ist eine Möglichkeit zu überprüfen, ob die aktuelle Zeile mit einer Nummer beginnt, die in Ihrem Array ist.

Eine Möglichkeit, das zu tun, ist die Zeile auf jedem Leerzeichen aufzuteilen, so dass Sie eine Liste aller Zahlen in dieser Zeile erhalten. Dann nimm nur die erste dieser Liste und konvertiere sie in eine Int. Dann können Sie einfach überprüfen, ob Int in Ihrer Array zulässigen Nummern vorhanden ist.

import java.io._ 
import scala.io.Source 

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")) 
    val toComment = Array(-10, 20, -30) 

    def main(args: Array[String]): Unit = { 
    def startsWithOneOf(line: String, list: Array[Int]) = 
     list.contains(line.split(" ").head.toInt) 

    for (line <- source) { 
     val lineOut = if (startsWithOneOf(line, toComment)) s"c $line" else line 
     destination.write(lineOut) 
     destination.write("\n") 
    } 

    s.close() 
    destination.close() 

    } 
} 
+0

In meinem Beispiel verwendete ich zwei verschiedene Dateien (um zu lesen von: 'example_01_txt', und um zu schreiben:' des_example_01_txt'). Ich habe Ihre Lösung versucht, indem ich versuche, in die gleiche Datei zu schreiben, _but_ wenn ich die Klasse 'PrintWriter' verwende, wird der Inhalt der Datei ersetzt (das heißt, Zeilen, die die Bedingung nicht erfüllen, werden entfernt), und wenn ich' 'verwende FileWriter (file, true) 'die Zeilen, die die Bedingung erfüllen, werden angehängt. Gibt es eine Möglichkeit, damit umzugehen? Vielen Dank, übrigens. – user4712458

+0

Ich verstehe. Ich wollte vermeiden, zusätzliche Dateien zu haben und sie zu pflegen. Vielen Dank! – user4712458

+0

@ user4712458 Ich glaube nicht, dass es möglich ist, nur bestimmte Zeilen zu ersetzen. Ich denke, das Schreiben in Dateien gibt es in 2 Modi: a) an Datei anhängen oder b) neue Datei schreiben (eventuell vorhandene Datei überschreiben). Wenn Sie also eine Zeile in einer Datei ändern möchten, müssen Sie die gesamte Datei einschließlich der unveränderten Zeilen schreiben. [Es gibt Möglichkeiten, beliebige Bytes in Dateien zu ändern] (https://docs.oracle.com/javase/7/docs/api/java/io/RandomAccessFile.html), aber das erlaubt Ihnen immer noch nicht, neue einzufügen Bytes in der Mitte, ohne die vorhandenen Bytes zu überschreiben. –

Verwandte Themen