从数字

时间:2017-01-15 18:06:10

标签: f#

我目前正在尝试编写一个程序,它能够获取一个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; - 现在有什么方法可以利用这个事实吗?

1 个答案:

答案 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)

当你发布文件内容时,我会提出我对其他方法的看法。