arrays - 快速将文本数据读入数组

标签 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:这个表达式应该有类型 '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/

相关文章:

mysql - forEach 循环不返回数组

java - 在浮点和整数数组中查找最大元素索引的常用方法

javascript - 查找数组中的第二大数

c# - 在 C# 中使用 LINQ 查找字符串数组中的确切子字符串

java - 将字符串拆分为数组

c - 查找数组中每个元素出现的次数并更新每个元素相关的信息

python - TypeError : strptime() argument 1 must be string, 不 float

java - 通用解析器返回 HashMap 而不是 Pojo

scala - Scala 编程语言有哪些可用的解析器?

javascript - 如何有效地从字节中读取位?