Как преобразовать строковый массив в массив с плавающей точкой и заменить Double.NaN нечисловыми значениями? - PullRequest
1 голос
/ 09 марта 2010

Я пишу парсер для данных CSV и пытаюсь определить, как обрабатывать записи которые не заполнены ("") или содержат символьные данные ("C"). Код синтаксического анализатора, который я имею ниже, прекрасно работает, но вынуждает меня иметь дело с преобразованиями с плавающей точкой позже. Я хотел бы иметь возможность просто сделать мою строку [] [] плавающей [] [] и обрабатывать преобразования при разборе файла, но я заметил, что он взрывается с любыми нечисловыми данными. В идеале не должно быть нечисловых или пустых значений, но они неизбежны, и поэтому с ними нужно иметь дело.

Может ли кто-нибудь порекомендовать краткий подход к попытке преобразования в 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 Ответ

4 голосов
/ 09 марта 2010

Используйте это вместо встроенного float преобразования:

let cvt s =
  let (ok,f) = System.Double.TryParse(s)
  if ok then f else nan
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...