요한의 댓글이 궤도에, 당신은 아마 존재하지 않는 파일을 읽으려고하고 있습니다. 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
이 경로는 아마해야'캐릭터'@ -'@ "C :/사용자/..." ', 그렇지 않으면'/'이스케이프 문자로 해석됩니다 . 이 오류는 아마도 존재하지 않는 파일을 여는 것입니다. –
이스케이프 문자는 '/'이 아닌 '\'입니다 – MiMo