Комментарий Джона выполняется, вы, вероятно, пытаетесь прочитать несуществующий файл. В 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
мы получаем BadUsageException
с сообщением "Класс записи CsvRecord нуждается в конструкторе без аргументов (открытых или закрытых)". Гораздо полезнее! Исправив это, код работает так, как ожидалось:
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
person
Robert Jeppesen
schedule
21.12.2012
@
-@"C:/Users/..."
, иначе/
интерпретируются как escape-символы. Ошибка, вероятно, открывает несуществующий файл - person John Palmer   schedule 21.12.2012