John 的评论正常,您可能正在尝试读取一个不存在的文件。在 Windows 中,反斜杠用于路径分隔,而不是(正)斜杠。这些反斜杠需要在 F# 字符串文字中进行转义。您看到这种情况的原因TypeInitializationException
是该代码是在加载类型时执行的。如果它在一个函数中,它会在被调用时执行,你会得到预期的异常。
有几种方法可以转义反斜杠,选择一种:
let res = engine.ReadFile("C:\\Users\\Admin\\Desktop\\test.csv")
let res = engine.ReadFile(@"C:\Users\Admin\Desktop\test.csv")
let res = engine.ReadFile("""C:\Users\Admin\Desktop\test.csv""")
最后一个,三重引用,是 F# 3.0 的一部分。http://blogs.msdn.com/b/fsharpteam/archive/2012/07/19/more-about-fsharp-3.0-language-features.aspx
编辑
您的代码在类型初始化中运行的事实掩盖了您的真正错误。尝试以不同的方式构建代码:
module ReadCsv = //-------------------------------------
open System
open FileHelpers
[<DelimitedRecord(",")>]
[<IgnoreFirst(1)>]
type CsvRecord =
class
val field1 : string
end
let read file =
let engine = new FileHelperEngine(typeof<CsvRecord>)
engine.ReadFile(file)
|> Array.map (fun row -> row :?> CsvRecord)
module Main = //--------------------------------
[<EntryPoint>]
let main argv =
let results = ReadCsv.read "C:/Users/Admin/Desktop/test.csv"
printfn "%A" results
0 // return an integer exit code
现在,TypeInitializationException
我们得到的不是BadUsageException
消息“记录类 CsvRecord 需要一个没有参数(公共或私有)的构造函数”。更有用!解决这个问题,代码按预期工作:
module ReadCsv = //-------------------------------------
open System
open FileHelpers
[<DelimitedRecord(",")>]
[<IgnoreFirst(1)>]
type CsvRecord() =
class
[<DefaultValue>]
val mutable field1 : string
end
let read file =
let engine = new FileHelperEngine(typeof<CsvRecord>)
engine.ReadFile(file)
|> Array.map (fun row -> row :?> CsvRecord)
module Main = //--------------------------------
[<EntryPoint>]
let main argv =
let results = ReadCsv.read "C:/Users/Admin/Desktop/test.csv"
results |> Seq.iter (fun r -> printfn "%s" r.field1)
0 // return an integer exit code