F# - 文件替换,覆盖文本中的单词,但是当 运行 时它会覆盖 txt 中的现有内容
F# - fileReplace, overwriting words in txt, but when running it overwrites exisiting content in txt
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
您编写的 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
首先要注意的是这个函数 returns 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
中的辅助函数即可。
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
您编写的 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
首先要注意的是这个函数 returns 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
中的辅助函数即可。