ジョンのコメントは順調に進んでいます。おそらく、存在しないファイルを読み取ろうとしているのでしょう。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