如何将字符串数组转换为float数组并将Double.NaN替换为非数字值?

时间:2010-03-09 15:59:14

标签: f#

我正在为CSV数据编写解析器,我正在尝试确定如何处理记录 为空(“”)或包含字符数据(“C”)。我下面的解析器代码效果很好,但是后来迫使我处理浮点转换。我希望能够让我的字符串[] []成为一个float [] [],并在解析文件时处理转换,但我注意到它会破坏任何非数字数据。理想情况下,不存在非数字或空白值,但它们是不可避免的,因此必须进行处理。

有人可能会推荐一种简洁的方法来尝试转换为Double,然后如果它不起作用,请替换为Double.NaN吗? (如果可能的话,不会牺牲很多性能)。谢谢。

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

//desiredFloatArray = [| 2.0; Double.NaN; Double.NaN |]


type csvData = { mutable RowNames: string[]; mutable ColNames: string[]; mutable Data: string[][] }

let csvParse (fileString: string) = 
    let colNames = ((fileLines fileString |> Seq.take 1 |> Seq.nth 0).Split(',')).[1..]
    let lines = fileLines fileString |> Seq.skip 1 |> Array.ofSeq
    let rowNames = Array.init lines.Length string;
    let allData : string [][] = Array.zeroCreate rowNames.Length 

    for i in 0..rowNames.Length - 1 do 
        let fields = lines.[i].Split(',') 
        allData.[i] <- fields.[1..]
        rowNames.[i] <- fields.[0]

    { RowNames = rowNames; ColNames = colNames; Data = allData }

1 个答案:

答案 0 :(得分:3)

使用此代替内置float转化:

let cvt s =
  let (ok,f) = System.Double.TryParse(s)
  if ok then f else nan