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

3
我需要在一个文本文件的中间添加一行,用于我的F#作业。该文件记录学生信息,格式如下,并且每个记录都在文件中单独占据一行:
[LastName],[FirstName],[MiddleInitial],[Telephone#],[EmailAddress],[GPA]
(逗号分隔数据项以便更好地区分)
我需要添加一个姓氏为“Constant”的学生(没有其他姓氏为“Constant”的学生,因此这使事情变得稍微容易了) - 以及他的信息 - 到 .txt 文件中,确保姓氏按字母顺序排列。换句话说,我需要在不删除任何现有记录的情况下将新的学生记录添加到文件的中间,而我完全被卡住了。我不期望(也不希望)有人为我完成作业,但我非常感激一些提示。

1
你会发现,1)这个问题并不是特定于F#的,2)对于C#,它已经被回答了数十次。 - ildjarn
3
@ildjarn提到的是另一种语言,WhiteWolf可能没有相关经验。 - TheQuickBrownFox
1
@TheQuickBrownFox:这是一个很好的起点-人们可以阅读解决问题的一般方法并查看涉及的API,从此可以知道要阅读哪些文档等。指针被要求,指针已经给出。 - ildjarn
2个回答

4

有几种方法可以解决这个问题,暂时我们将忽略按姓氏字母顺序排序的棘手问题,以及处理极大文件的问题。你应该学习不同的读取写入文件的方法。

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

问题的一个重要“特点”是如何读写文本文件。

一个好的小片段的地方是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

注意:在这个例子中,输入文件和输出文件是不同的文件;一旦重要的部分工作正常,我会在以后解决这个问题,但这是需要注意的事情。


1
为什么不直接使用 File.ReadAllLinesFile.WriteAllLines?一个好的文档来源是 MS Docs - s952163
1
@s952163 我之前没有注意到那些方法,它们确实很适合。 :-) - Robert Nielsen

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