首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >F# CSV FileHelpers

F# CSV FileHelpers
EN

Stack Overflow用户
提问于 2012-12-21 13:38:35
回答 1查看 483关注 0票数 1

我正在按照下面描述的步骤读取csv,但在最后一行得到运行时错误。

(TypeInitializationException)

有人能告诉我这里出了什么问题吗?

http://www.markstaples.com/2009/01/08/parsing-csv-files-in-f/

代码语言:javascript
复制
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  
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-21 22:27:47

John的评论是正确的,您可能正在尝试读取一个不存在的文件。在Windows中,反斜杠用于路径分隔,而不是(正)斜杠。这些反斜杠需要在F#字符串文字中进行转义。您之所以将其视为TypeInitializationException,是因为此代码在加载类型时执行。如果它在一个函数中,那么它将在被调用时执行,您将得到预期的异常。

有几种方法可以转义反斜杠,请选择其中一种:

代码语言:javascript
复制
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

编辑您真正的错误被代码在类型初始化中运行的事实所掩盖。尝试以不同的方式构建您的代码:

代码语言:javascript
复制
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需要一个没有参数的构造器(公有或私有)”的构造函数。更有用!修复后,代码按预期运行:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13984823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档