快速将文本数据读入数组

时间:2014-12-19 23:51:09

标签: arrays string parsing f#

我很难使用F#从文本文件读取浮点数组。文本文件有很多其他数据类型,所以我不能使用CSV解析器,但我确信必须有一个简单的功能来执行此操作。在Python中,我只是遍历所有感兴趣的行,并使用以下内容将它们附加到现有数组:Reading file string into an array (In a pythonic way)

arrays = []
i = 1
for line in open(your_file):
    if i > startOfNumericDataIndex
        new_array = np.array((array.float(i) for i in line.split(' '))) 
        arrays.append(new_array)
    i++

我正在尝试避免使用符合F#样式的循环,但以下尝试不起作用:

let lines = System.IO.File.ReadLines(path) //Collection
let linesStringArray = lines |> Seq.toArray // String array
let linesFloatArray = linesStringArray |> Array.map (fun x -> float x)

我得到了错误FS0001:这个表达式预计会有一个类型'列表但是这里有类型字符串但是我已经乱搞了很长时间将其转换为字符串列表和其他类型无效。

这种方法看起来很有希望:  How to convert string array to float array and substitute Double.NaN for non-numeric values?:但我无法弄清楚如何使用给出的答案:

let stringLine = [| "2.0"; "3.0"; "2.0"|]    
let stringLine2Float = Array.map float stringLine

刚刚给出错误'类型''列表'与类型'字符串''不匹配。

1 个答案:

答案 0 :(得分:2)

我会避免将这些行转换为数组,并使用Seq.collect将所有行展平为一个序列:

let lines = System.IO.File.ReadLines(path) //Collection
let linesFloatArray = linesStringArray 
|> Seq.skip startOfNumericDataIndex
|> Seq.collect (fun line -> line.Split(' '))
|> Seq.map (fun x -> float.Parse x)
|> Array.ofSeq

如果你想要一个数组数组,你可以这样做:

let lines = System.IO.File.ReadLines(path) //Collection
let linesFloatArray = linesStringArray 
|> Seq.skip startOfNumericDataIndex
|> Seq.map (fun line -> line.Split(' ') |> Array.map (fun x -> float.Parse(x)))
|> Array.ofSeq