f# - fileReplace,覆盖文本中的单词,但在运行时覆盖文本中的现有内容


    open System
//helpfunction
let fileReplace filename needle replace =
  let replaceIn (reader:System.IO.StreamReader) needle (replace: String) =
    while not(reader.EndOfStream) do
      let mutable allText = reader.ReadToEnd()
      allText <- allText.Replace(needle, replace)
    reader.Close()
  //start
  let reader = System.IO.File.OpenText filename
  let newText = replaceIn reader needle replace
  let writer = System.IO.File.CreateText filename
  writer.Write newText ; writer.Close()
// testing
let filename = @".abc.txt"
let needle = "med"
let replace = "MED"
fileReplace filename needle replace

我已经尝试了一堆移动reader.Close(),但还没有结果。我知道,如果我在reader.Close()下插入printfn "%A" allText,它会打印正确的结果,所以我怀疑当我调用writer时,它出错了。我需要的代码来取代med,与med在abc.txt。但是它留下了一个空白的abc.txt

您所编写的replaceIn函数不做任何事情。让我们把这个分开:

let replaceIn (reader:System.IO.StreamReader) needle (replace: string) =
    while not(reader.EndOfStream) do
        let mutable allText = reader.ReadToEnd()
        allText <- allText.Replace(needle, replace)
    reader.Close()

首先,看看这个函数的类型:

val replaceIn :  reader:System.IO.StreamReader -> needle:string -> replace:string -> unit

首先要注意的是,该函数返回unit,这意味着无论文件内容如何,newText总是具有()的值。这意味着你总是不写任何东西到你的文件。

此外,循环是多余的。您正在读取到流的末尾,但循环直到流的末尾-此循环是不必要的。无论如何,也没有办法观察循环的结果,因为您创建的用于存储结果的可变变量在循环中。


那么,让我们看看另一个选项:

let fileReplace filename (needle : string) (replace : string) =
    let allText = System.IO.File.ReadAllText filename
    let newText = allText.Replace(needle, replace)
    System.IO.File.WriteAllText(filename, newText)

如您所见,您甚至不需要创建阅读器,您只需在System.IO.File中使用辅助函数即可。

相关内容

  • 没有找到相关文章

最新更新