我目前正在尝试编写一个程序,它能够获取一个txt文件,并将该文件中的数字表转换为第1列中的数字列表,第2列中的另一个列表等。
由于txt文件的结构,我从数字中制作列表没有问题,问题是我应该如何从txt文件创建的字符串中删除不相关的部分。
截至目前我的代码:
let mutable s = ""
let readerStream = System.IO.File.OpenText "x.txt"
let readFile (stream : System.IO.StreamReader) =
while not(stream.EndOfStream) do
let mutable line = stream.ReadLine ()
s <- s + sprintf "%s" line.ToLower()
stream.Close()
readFile readerStream
s <- s.[3600..1253900]
printfn "%s" s
printf "%A" (String.length s)
我最初的方法是使用String.Replace删除除数字之外的任何字符的每个实例,但是很快就弄乱了,然后我意识到列上方和下方的文本也包含数字,这将呈现这种方法无用的。
如上所述,txt文件都具有相似的结构,这意味着我可以通过索引删除大部分不相关的文本,如我在第三行的第三行所示,然后我可以使用String.Replace删除剩余的文本,我没用。这种方法当然有效,但我想知道是否有更聪明的方法来做到这一点。
我已经附加了其中一个txt文件,如果它有助于使问题更容易理解。
在数字列开始和结束之前,有一个关键字:&#34; $$ EOE&#34; - 现在有什么方法可以利用这个事实吗?
答案 0 :(得分:2)
在没有文本文件的情况下提供答案很困难,我假设您很快就会上传。我会对它进行一次尝试,但描述和代码现在还不匹配。
我可以提供的是有一些小的空白问题阻止它编译,并且有一些不必要的mutable
变量,我认为由于字符串连接的数量很多,你将会想要使用StringBuilder
。这是一个初步的整理:
let sb = StringBuilder()
let readerStream = System.IO.File.OpenText "x.txt"
let readFile (stream : System.IO.StreamReader) =
while not(stream.EndOfStream) do
let line = stream.ReadLine ()
line.ToLower() |> sb.Append |> ignore
stream.Close()
readFile readerStream
let s = sb.ToString().[3600..1253900]
printf "%s" s
printf "%i" (String.length s)
当你发布文件内容时,我会提出我对其他方法的看法。