如何在F#中的.txt文件中间添加一行

时间:2017-10-18 16:20:00

标签: .net file-io f#

我必须为我的一个F#分配在.txt文件的中间添加一行。该文件是以下格式记录的学生,每个记录在文件中都有自己的行:

[姓氏],[姓名],[MiddleInitial],[电话#],[EmailAddress的],[GPA]

(逗号分隔数据项以防万一)

我需要添加一个姓氏为" Constant" (没有其他学生的姓氏为" Constant",这样可以使事情变得更容易) - 连同他的信息 - 到.txt文件,确保保留姓氏按字母顺序排列。换句话说,我需要在文件中间添加一条新的学生记录而不删除任何现有记录,而且我完全难倒了。我不希望(我也不想)有人为我做任务,但我非常感谢一些指示。

2 个答案:

答案 0 :(得分:3)

有几种方法可以解决这个问题,目前我们将忽略按姓氏字母排序的棘手问题,以及处理极大文件的问题。你绝对应该研究readingwriting files的不同方式。

open System
open System.IO
let students = @"C:\tmp\students.txt"
let newRec = [|"Constant,Dunham,X,99999,cdx@gmail.com,2.0"|]

students 
|> File.ReadAllLines
|> Array.append newRec
|> Array.sort
|> (fun x -> File.WriteAllLines(students,x))

我相信这段代码或多或少是不言自明的,但如果您知道需要澄清,请告诉我。

答案 1 :(得分:1)

其中一项重要功能'问题是如何读写文本文件。

小片段的好地方是F# Snippets,但如果你不完全确定你在寻找什么,那么去那里寻找并不容易。

以下是两个有用的功能,最初来自Don Syme等人的书:

open System.IO

/// Read all lines from UTF-8 encoded text file as a sequence.
let linesFromFile filename =
    seq { use reader = File.OpenText filename
          while not reader.EndOfStream
             do yield reader.ReadLine () }

/// Create a new UTF-8 encoded text file and
/// write all lines from a sequence to the new file.
let linesTofile filename (lines: string seq) =
    use writer = File.CreateText filename
    for line in lines
     do writer.WriteLine line

然后,您可以专注于编写一个函数,该函数将采用字符串序列并根据您的喜好对其进行操作。在伪代码中:

do linesFromFile inputfilename
   |> myStringSeqFunction
   |> linesTofile outputfilename

警告:在此示例中,输入文件和输出文件是不同的文件;一旦重要的东西工作,我会在以后的机会解决这个问题,但需要注意的是。