【问题标题】:F# - fileReplace, overwriting words in txt, but when running it overwrites exisiting content in txtF# - 文件替换,覆盖文本中的单词,但运行时会覆盖 txt 中的现有内容
【发布时间】:2016-11-02 13:12:25
【问题描述】:
    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 时我怀疑它出错了。我需要用 abc.txt 中的 MED 替换 med 的代码。但它却留下了一个空的 abc.txt

【问题讨论】:

    标签: replace f# stream overwrite opentext


    【解决方案1】:

    您编写的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 中的辅助函数即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-11
      • 2014-11-22
      • 2015-01-03
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      相关资源
      最近更新 更多