我需要在fsharp中制作一个程序,用另一个字符串“替换”替换输入文本文件中所有出现的字符串“needle”。一个很好的解决方案已经发布在这里:

F# - fileReplace, overwriting words in txt, but when running it overwrites exisiting content in txt

不幸的是,我的程序必须显式地使用上述解决方案未使用的函数 System.IO.File.OpenText ReadLine WriteLine 函数。

我看不出如何有效而又不费吹灰之力地做到这一点。问题是,如果您使用 System.IO.File.OpenText 打开输入文件,那么您将无法同时读取和写入该文件。但是我们需要编写代码以替换上述出现的needle参数。那该怎么办呢?您是否需要制作另一个临时文件,以只写方式打开它,然后使用等于 system.IO.FILe.OpenText.readLine 的输入在其上执行WriteLine?这似乎太复杂了。

如果有人需要,我将在下面添加特定的任务:

用F#编写程序

 fileReplace : string -> needle : string -> replace: string -> unit

这会在名称为filename的文件中将所有出现的needle参数替换为replace参数。解决方案必须至少使用 System.IO.File.OpenText ReadLine WriteLine 函数来访问文件。

必须包括一个简短的测试,一个简短的解决方案描述,以及为达到给定解决方案而选择更大设计的理由

最佳答案

为了在不给出完整答案的情况下为您提供一些帮助,下面的示例演示了如何使用作业中提到的功能来处理文件。

它实现了一个简单的代码段,该代码段逐行从一个文本文件读取数据,并将数据(不替换任何内容)写入另一个文件:

open System.IO

let fileIn = File.OpenText("C:\\Temp\\test-in.txt")
let fileOut = File.CreateText("C:\\Temp\\test-out.txt")

let mutable line = fileIn.ReadLine()
while line <> null do
  fileOut.WriteLine(line)
  line <- fileIn.ReadLine()

fileIn.Close()
fileOut.Close()

棘手的是,ReadLine在文件末尾返回null。以一种很好的功能方式处理这个问题不是很好,所以我只使用了可变变量和while循环,但是您可以使用递归或列表推导来做同样的事情。

这将从一个文件读取数据,并将其逐行写入另一个文件。这避免了将所有内容读取到内存中的需要,但是这意味着您需要两个文件,因为在读取文件时您不能(使用这些功能)覆盖文件。

要解决您的问题,您可以创建一个临时文件,然后用新文件替换原始文件,或者可以在进行替换之前将所有数据读入内存。

10-05 23:13