我需要在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
循环,但是您可以使用递归或列表推导来做同样的事情。这将从一个文件读取数据,并将其逐行写入另一个文件。这避免了将所有内容读取到内存中的需要,但是这意味着您需要两个文件,因为在读取文件时您不能(使用这些功能)覆盖文件。
要解决您的问题,您可以创建一个临时文件,然后用新文件替换原始文件,或者可以在进行替换之前将所有数据读入内存。