我必须为我的一个F#分配在.txt文件的中间添加一行。该文件是以下格式记录的学生,每个记录在文件中都有自己的行:
[姓氏],[姓名],[MiddleInitial],[电话#],[EmailAddress的],[GPA]
(逗号分隔数据项以防万一)
我需要添加一个姓氏为" Constant" (没有其他学生的姓氏为" Constant",这样可以使事情变得更容易) - 连同他的信息 - 到.txt文件,确保保留姓氏按字母顺序排列。换句话说,我需要在文件中间添加一条新的学生记录而不删除任何现有记录,而且我完全难倒了。我不希望(我也不想)有人为我做任务,但我非常感谢一些指示。
答案 0 :(得分:3)
有几种方法可以解决这个问题,目前我们将忽略按姓氏字母排序的棘手问题,以及处理极大文件的问题。你绝对应该研究reading和writing 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
警告:在此示例中,输入文件和输出文件是不同的文件;一旦重要的东西工作,我会在以后的机会解决这个问题,但需要注意的是。