我正在为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 }
答案 0 :(得分:3)
使用此代替内置float
转化:
let cvt s =
let (ok,f) = System.Double.TryParse(s)
if ok then f else nan