2012-12-21 3 views
1

다음 단계에 따라 csv를 읽지 만 마지막 행에서 런타임 오류가 발생합니다.
(TypeInitializationException)
아무도 나에게 무엇이 잘못되었는지 말해 줄 수 있습니까?F # CSV FileHelpers

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 
+0

이 경로는 아마해야'캐릭터'@ -'@ "C :/사용자/..." ', 그렇지 않으면'/'이스케이프 문자로 해석됩니다 . 이 오류는 아마도 존재하지 않는 파일을 여는 것입니다. –

+1

이스케이프 문자는 '/'이 아닌 '\'입니다 – MiMo

답변

2

요한의 댓글이 궤도에, 당신은 아마 존재하지 않는 파일을 읽으려고하고 있습니다. 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이 (공용 또는 개인)없이 인수를 가진 생성자가 필요합니다"라는 메시지와 함께 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 
+0

시도했습니다. res = engine.ReadFile ("D : \\ test1.csv") 및 let = engine.ReadFile (@ "D : \ test1.csv") 둘 다 동일한 예외를 제공하고 세 번째 것은 이 컴파일되지 않습니다. – Chris

+0

@chris 답변을 업데이트했습니다. –

+0

코드가 완벽하게 작동합니다. 도와 줘서 고마워 !! btw, 사람들이 F #에서 런타임 오류를 어떻게 디버깅하는지 궁금합니다. 나는 디버깅을 느낀다 F # 코드는 정보의 가용성이 낮아서 고통스런 것이다. – Chris