F#中的FileReplace

3
我需要在fsharp中编写一个程序,用另一个字符串 "replace" 替换输入文本文件中所有出现的字符串 "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 吗?这似乎太复杂了。
如果有人需要具体的任务,请参考下面的内容:

Make a program in F#

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

which replaces all occurrences of the needle argument with the replace argument in the file with name filename. The solution must as a minimum use the functions System.IO.File.OpenText, ReadLine and WriteLine to access the files.

A short test must be included and a short description of the solution with arguments for larger design choices taken to reach the given solution


1
打开文件,读取内容,关闭文件,将必要的字符串替换在内存中,然后写回内容,这个方案怎么样? - s952163
4
一种可能的解决方案是将整个文件读入内存,然后进行替换操作,最后将结果写回文件。 - Fyodor Soikin
1
我考虑使用Readline逐行读取并将每个结果字符串保存到数组中,然后我们可以对数组中的每个字符串执行replace方法,最后创建一个与旧文件同名的新文件,并使用Writeline将每个字符串写入其中。这是你想要的吗? - sss
1
谢谢您坦率地说明这是一项任务;这有助于我们知道如何最好地帮助您。(即不要发布代码,而是给出提示以便您自己找到答案)。我在Stack Overflow上看到了许多“请帮我完成作业”的问题,但很少有人直接说明这是一项作业任务(尽管通常很明显)。+1因为您坦率地说明了这一点,这使得这个问题比如果您没有提到这一事实要好得多。 - rmunn
1个回答

1
为了帮助您理解,以下示例展示了如何使用作业中提到的函数来处理文件。它实现了一个简单的代码片段,逐行从一个文本文件读取数据,并将数据(不替换任何内容)写入另一个文件:
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循环,但您也可以使用递归或列表推导来做到同样的效果。
这将从一个文件中读取数据,并逐行写入另一个文件。这避免了需要将所有内容读入内存的需求,但这意味着您需要两个文件,因为您不能(使用这些函数)在读取文件时覆盖该文件。
要解决您的问题,您可以创建一个临时文件,然后用新文件替换原始文件,或者在进行替换之前将所有数据读入内存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接