Linda Su
Linda Su

Reputation: 455

How to delete the last line of the file in scala?

I am trying to append to a file such that I first want to delete the last line and then start appending. But, I can't figure how to delete the last line of the file.

I am appending the file as follows:

val fw = new FileWriter("src/file.txt", true) ;
fw.write("new item");

Can anybody please help me?

EDIT:

val lines_list = Source.fromFile("src/file.txt").getLines().toList 
val new_lines = lines_list.dropRight(1) 
val pw = new PrintWriter(new File("src/file.txt" )) 
(t).foreach(pw.write) pw.write("\n") 
pw.close()

After following your method, I am trying to write back to the file, but when I do this, all the contents, with the last line deleted come in a single line, however I want them to come in separate lines.

Upvotes: 0

Views: 2654

Answers (3)

Marcs
Marcs

Reputation: 3838

My scala is way off, so people can probably give you a nicer solution:

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

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

    val lines = Source.fromFile("src/file.txt").getLines().toList.dropRight(1)

    val pw = new PrintWriter(new File("src/out.txt" ))

    (lines :+ "another line").foreach(pw.println)

    pw.close()
  }
}

Sorry for the hardcoded appending, i used it just to test that everything worked fine.

Upvotes: 0

elm
elm

Reputation: 20415

For very large files a simple solution relies in OS related tools, for instance sed (stream editor), and so consider a call like this,

import sys.process._
Seq("sed","-i","$ d","src/file1.txt")!

which will remove the last line of the text file. This approach is not so Scalish yet it solves the problem without leaving Scala.

Upvotes: 1

Andrzej Jozwik
Andrzej Jozwik

Reputation: 14649

Return random access file in position without last line.

import java.io.{RandomAccessFile, File}

  def randomAccess(file: File) = {
    val random = new RandomAccessFile(file, "rw")

    val result = findLastLine(random, 0, 0)
    random.seek(result)
    random
  }

  def findLastLine(random: RandomAccessFile, position: Long, previous: Long): Long = {

    val pointer = random.getFilePointer
    if (random.readLine == null) {
      previous
    } else {
      findLastLine(random, previous, pointer)
    }
  }


  val file = new File("build.sbt")
  val random = randomAccess(file)

And test:

  val line = random.readLine()
  logger.debug(s"$line")

Upvotes: 0

Related Questions