F-Sharp中的FileReplace

时间:2018-03-31 03:19:43

标签: file replace f#

我需要在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 打开输入文件,则无法同时读取和写入文件。但是我们需要编写以替换上述针参数的出现。那么该怎么做呢?你需要制作另一个临时文件,以只写方式打开它,然后使用等于 system.IO.FILe.OpenText.readLine 的输入对其执行WriteLine吗?这似乎太复杂了。

如果有人需要,我会在下面添加具体作业:

  

在F#中制作节目

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

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

     

必须包含一个简短的测试,并提供解决方案的简短描述,并提供更大设计选择的参数以达到给定的解决方案

1 个答案:

答案 0 :(得分: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循环,但你可以使用递归或列表推导来做同样的事情。

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

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