我在使用 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:这个表达式应该有类型 'a list 但这里有类型 string 但我已经把它转换成字符串和其他类型的列表多年无济于事。
这种方法看起来很有希望:
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
刚刚给出错误“类型''列表'与类型'字符串''不匹配。
最佳答案
我会避免将行转换为数组,并使用 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
关于arrays - 快速将文本数据读入数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27575522/