File 在文件中查找字符串,替换“后的所有内容”=&引用;?

File 在文件中查找字符串,替换“后的所有内容”=&引用;?,file,scala,io,replace,File,Scala,Io,Replace,我想读取一个文件,找到一些字符串并替换此行中符号“=”之后的所有内容 假设我有这样一个文本文件: name=whatever age=150 id.from.system=10298092_42_42 path=D:\name\somewhere whatever_A= WHATEVER val source = io.Source.fromFile("C:/myfile.txt) val lines = source.mkString source.close() 假设我想改变路径。首先

我想读取一个文件,找到一些字符串并替换此行中符号“=”之后的所有内容

假设我有这样一个文本文件:

name=whatever
age=150
id.from.system=10298092_42_42

path=D:\name\somewhere
whatever_A= WHATEVER
val source = io.Source.fromFile("C:/myfile.txt)
val lines = source.mkString
source.close()
假设我想改变路径。首先,我必须找到字符串“path”,然后以某种方式替换“=”之后的所有内容。有什么想法吗?我知道我可以很容易地逐行阅读文件,比如:

name=whatever
age=150
id.from.system=10298092_42_42

path=D:\name\somewhere
whatever_A= WHATEVER
val source = io.Source.fromFile("C:/myfile.txt)
val lines = source.mkString
source.close()
但这可能不是最好的主意,因为读取整个文件的性能不高(可能文件有10000000行,字符串已经在第2行,但我的程序将读取整个文件。这是不必要的)


可能还有另一个问题:如果我搜索特定的字符串,比如这里的“name”,但是这些字符串在那里出现了好几次。我想确保它唯一有效的是在字符串后面有一个“=”。也许我可以一直搜索结尾带有“=”的东西,这样可以解决问题。但是我不知道如何在一个漂亮的scala代码中编写它。

您可以使用迭代器只进行迭代,直到找到要查找的行

val source = io.Source.fromFile("somePath").getLines
val line = source.find(_.startsWith("path="))

行将包含以“path=”开头的第一行。

您可以使用迭代器只进行迭代,直到找到要查找的行为止

val source = io.Source.fromFile("somePath").getLines
val line = source.find(_.startsWith("path="))

行将包含以“path=”开头的第一行。

如果您的C:/myfile.txt包含行
path=D:\name\somewhere
,您可以用以下代码替换
D:\name\somewhere

val lines = fromString("path=D:\\name\\somewhere").getLines // use fromFile here 
for { in <- lines
      out <- if (in startsWith("path=")) "path=D:\\my\\path" else in
} yield out
您需要使用
fromFile
获取行并将行写入新文件

这里有另一种方法可以实现同样的效果:

val lines = fromString("path=D:\\name\\somewhere").getLines
lines.map(in => if (in startsWith("path=")) "path=D:\\my\\path" else in)

如果您的C:/myfile.txt包含行
path=D:\name\somewhere
,则可以用以下代码替换
D:\name\somewhere

val lines = fromString("path=D:\\name\\somewhere").getLines // use fromFile here 
for { in <- lines
      out <- if (in startsWith("path=")) "path=D:\\my\\path" else in
} yield out
您需要使用
fromFile
获取行并将行写入新文件

这里有另一种方法可以实现同样的效果:

val lines = fromString("path=D:\\name\\somewhere").getLines
lines.map(in => if (in startsWith("path=")) "path=D:\\my\\path" else in)

但这不是迭代器,对吗?我不知道如何用我的新字符串替换该行。getLines方法将为您提供一个迭代器,而.find方法将在迭代器上迭代,直到与uu.startsWith(“path=”)的第一个匹配项匹配为止。关于替换字符串,您是否尝试用替换的值编写文件?啊,现在我明白了,谢谢。是的,我想写入这个文件并替换“=”后面的值。因此,如果我发现“path=”我想用我自己的字符串替换“D:\name\somewhere”值(或者说,这一行中“=”后面的所有内容)。您必须写入整个文件,或者至少写入替换行之后的部分,因为新替换的行可能比前一行长,这将在替换行后覆盖数据。但这不是迭代器,对吗?我不知道如何用我的新字符串替换该行。getLines方法将为您提供一个迭代器,而.find方法将在迭代器上迭代,直到与uu.startsWith(“path=”)的第一个匹配项匹配为止。关于替换字符串,您是否尝试用替换的值编写文件?啊,现在我明白了,谢谢。是的,我想写入这个文件并替换“=”后面的值。因此,如果我发现“path=”我想用我自己的字符串替换“D:\name\somewhere”值(或者说,这一行中“=”后面的所有内容)。您必须写入整个文件,或者至少写入替换行之后的部分,因为新替换的行可能比前一行长,这将在替换行后覆盖数据。