F#解析CSV文件 - 找出哪行错误

时间:2013-08-06 12:59:57

标签: parsing csv f# filehelpers

我从我发现的一些资源中编写了这个脚本。它工作但我有些文件我有问题。我是F#的新手,所以如何使用FileHelpersException更改行以获得确切的行问题?感谢

// Learn more about F# at http://fsharp.net
// See the 'F# Tutorial' project for more help.
open FileHelpers  
open System

[<DelimitedRecord(",")>]
type CsvRecord =
    class
        val field1 : string
        val field2 : string
        val field3 : int
        new () = {
        field1 = ""
        field2 = ""
        field3 = 0
        }
    end

[<EntryPoint>]
let main argv = 
    use file = System.IO.File.CreateText("result.txt")
    let engine = new FileHelperEngine<CsvRecord>()
    engine.Encoding <- new Text.UTF8Encoding()
    let res = 
       try
          engine.ReadFile("test.csv")
       with
          | :? FileHelpersException -> Array.empty<CsvRecord>
    for record in res do
         fprintfn file "%s" record.field1
    printf "DONE!"
    let s = Console.ReadLine()
    0 // return an integer exit code

2 个答案:

答案 0 :(得分:5)

我建议你改用CsvTypeProvider。当存在不匹配时,错误消息指出具有错误的行

open FSharp.Data

[<EntryPoint>]
let main argv = 
    use file = System.IO.File.CreateText("result.txt")
    let csv = new CsvProvider<"test.csv">()
    for record in csv.Data do
        fprintfn file "%s" record.field1

如果您想忽略有错误的行,只需将IgnoreErrors=true作为额外参数传递给CsvProvider

答案 1 :(得分:2)

这个问题是关于你正在使用的FileHelpers库,而不是F#,所以查看docs for that可能有所帮助。在这种情况下,您可以检查ConvertException而不是FileHelpersException,其中包含的成员会为您提供有关该成员的更多详细信息。

try
    engine.ReadFile("test.csv")
with
    | :? ConvertException as ex ->
        printfn "ERROR: Line %d Col %d" ex.LineNumber ex.ColumnNumber
        Array.empty<CsvRecord>

我同意Gustavo,你可能会发现使用CsvTypeProvider更容易。