我正在按照下面描述的步骤读取csv,但在最后一行得到运行时错误。
(TypeInitializationException)
有人能告诉我这里出了什么问题吗?
http://www.markstaples.com/2009/01/08/parsing-csv-files-in-f/
module ReadCsv //-------------------------------------
open System
open FileHelpers
[<DelimitedRecord(",")>]
[<IgnoreFirst(1)>]
type CsvRecord =
class
val field1 : string
end
type oneRow() =
class
[<DefaultValue>]
val mutable Str1: string
[<DefaultValue>]
val mutable Str2: string
end
let engine = new FileHelperEngine(typeof<CsvRecord>)
let res = engine.ReadFile("C:/Users/Admin/Desktop/test.csv")
module main //--------------------------------
let downcast_Customer_Array = Array.map (fun (a:obj) -> a :?> ReadCsv.CsvRecord)
let res_Customers = downcast_Customer_Array ReadCsv.res 发布于 2012-12-21 22:27:47
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,而是一个带有消息“记录类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 codehttps://stackoverflow.com/questions/13984823
复制相似问题