在scala

时间:2015-11-21 19:07:20

标签: scala

我已经看过this question,但我并不完全确定我能用所提供的答案达到我想要的效果。

请注意,这只是学习Scala的经验。我将为您提供的示例可能没有意义。

我想打开我的〜/ .subversion / servers文件,如果我发现一行包含" proxy"我想要评论它(基本上我只想在角色前加上#34;#")。每隔一行必须保持原样。

所以,这个文件:

Line 1
Line 2
http-proxy-host = defaultproxy.whatever.com
Line 3

会变成:

Line 1
Line 2
# http-proxy-host = defaultproxy.whatever.com
Line 3

我能够读取文件,找到我想要更改的行并打印它们。这是我到目前为止所做的:

val fileToFilter = new File(filePath)

io.Source.fromFile(fileToFilter)
  .getLines
  .filter( line => !line.startsWith("#"))
  .filter( line => line.toLowerCase().contains("proxy") )
  .map( line => "#" + line )
  .foreach( line => println( line ) )

我错过了两件事:

  1. 如何保存我对文件所做的更改(我可以直接执行此操作,还是需要将更改复制到临时文件,然后将"服务器"文件替换为那个临时文件?)
  2. 如何应用"地图"有条件的(如果我发现单词"代理",我在前面加#34;#",否则我按原样保留该行。)
  3. 这可能吗?我是否遵循正确的方法来解决这个问题?

    非常感谢。

2 个答案:

答案 0 :(得分:3)

  1. 保存到其他文件并将其重命名为原始文件。
  2. 使用if-else
  3. 这应该有效:

    import java.io.File
    import java.io.PrintWriter
    import scala.io.Source
    
    val f1 = "svn.txt"  // Original File
    val f2 = new File("/tmp/abc.txt") // Temporary File
    val w = new PrintWriter(f2)
    Source.fromFile(f1).getLines
      .map { x => if(x.contains("proxy")) s"# $x" else x }
      .foreach(x => w.println(x))
    w.close()
    f2.renameTo(f1)
    

答案 1 :(得分:0)

库存scala库中没有“替换”文件方法:因此您将打开文件(如您所示),进行更改,然后将其保存(也以各种方式执行)到同一路径

AFA如果他们有代理,则将某些行更新为#:

.map line { case l if l.contains("proxy") => s"# $l"
              case l => l
       }