我从我发现的一些资源中编写了这个脚本。它工作但我有些文件我有问题。我是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
答案 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更容易。