2017-01-27 13 views
-1

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

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

Мне нужно написать письмо с пробелом перед каждой строкой, которая соответствует критерий относительно первого значения/числа в строке, например, если я дам значение 20, то файл должен выглядеть следующим образом:

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

Как я могу добиться этого в Scala?

Это то, что я пытаюсь, до сих пор:

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() 

    } 
} 

Я могу написать в другой файл, скажем, но мне нужно написать в том же файле, и только тогда, когда линия встречает такое условие ,

Буду признателен за любую помощь.

+0

С какими проблемами вы столкнулись, когда вы внедрили его сами? – Dima

+0

Это не по теме для SO. Вероятно, вам больше повезло на таких сайтах, как http://freelancer.com – Dima

+0

Я сделал редактирование (см. Вверх) о том, что я пытаюсь. Я хотел оставить вопрос простым для всех, кто может помочь (и не обижаться. @Dima). – user4712458

ответ

0

Начиная с того, что у вас есть, все, что вам действительно нужно добавить, это способ проверить, начинается ли текущая строка с номера, который находится в вашем Array.

Один из способов сделать это - разделить линию на каждое пространство, чтобы получить список всех номеров на этой линии. Затем возьмите только первый из этого списка и преобразуйте его в Int. Затем вы можете просто проверить, есть ли Int в ваших Array разрешенных номеров.

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

В моем примере я использовал 2 разных файла (для чтения из: 'example_01_txt' и для записи:' des_example_01_txt'). Я попробовал ваше решение, пытаясь записать в том же файле _but_, когда я использую класс 'PrintWriter', содержимое файла заменяется (что означает, что строки, которые не удовлетворяют условию, удаляются), и когда я использую' FileWriter (file, true) 'строки, которые выполняют условие, добавляются. Есть ли способ справиться с этим? Большое спасибо, кстати. – user4712458

+0

Я вижу. Я хотел избежать лишних файлов и их сохранения. Большое спасибо! – user4712458

+0

@ user4712458 Я не думаю, что можно заменить только определенные строки. Я думаю, что запись в файлы происходит в двух режимах: a) добавление к файлу или b) запись нового файла (возможно, перезапись существующего файла). Поэтому, если вы хотите изменить строку в файле, вам нужно будет написать весь файл, включая неизменные строки. [Есть способы изменить произвольные байты в файлах] (https://docs.oracle.com/javase/7/docs/api/java/io/RandomAccessFile.html), но это все еще не позволяет вам вставлять новые байты в середине без перезаписи существующих байтов. –