1

以下で説明する手順に従って 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  
4

1 に答える 1

2

ジョンのコメントは順調に進んでいます。おそらく、存在しないファイルを読み取ろうとしているのでしょう。Windowsでは、パスの区切りにはバックスラッシュが使用され、(フォワード)スラッシュは使用されません。これらの円記号は、F#文字列リテラルでエスケープする必要があります。これが表示される理由TypeInitializationExceptionは、型がロードされたときにこのコードが実行されるためです。関数内にある場合は、代わりに呼び出されたときに実行され、予期された例外が発生します。

バックスラッシュをエスケープする方法はいくつかあります。1つ選択してください。

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

ここで、「レコードクラスCsvRecordには、引数(パブリックまたはプライベート)のないコンストラクターが必要です」というメッセージが表示さTypeInitializationExceptionれる代わりに、が表示されます。BadUsageExceptionはるかに便利です!これを修正すると、コードは期待どおりに機能します。

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
于 2012-12-21T14:27:46.927 に答える