我按照parse CSV using F# and filehelpers的链接。编译器出现以下代码错误"The record class oneRow need a constructor with no args (public or private)"
[<DelimitedRecord(",")>]
type oneRow=
class
[<FieldConverter(ConverterKind.Date, "M/d/yyyy")>]
val date: DateTime
val value: bool
end
let engine = new FileHelperEngine(typeof<oneRow>)
let tmp = engine.ReadFile("test.csv")
修改
该解决方案看起来比c#版本更加冗长。我需要添加()
,mutable
和[<DefaultValue>]
type oneRow() =
class
[<FieldConverter(ConverterKind.Date, "M/d/yyyy")>]
[<DefaultValue>]
val mutable date: DateTime
[<DefaultValue>]
val mutable value: bool
end
但类似的代码在C#中工作而没有指定构造函数。任何人都可以帮我修复F#代码吗?谢谢。
答案 0 :(得分:2)
C#将为您创建一个构造函数。 F#没有(大概是因为无参数构造函数意味着可变性,因此并不完全鼓励。)
例如,在您的代码中 - 您将如何设置这些属性,它们仍然是不可变的。
答案 1 :(得分:2)
关于详细的语法 - 它可以更好。该样本是在前一段时间(2年)编写的,所以它仍然使用一些旧的语法。它可以更新,以允许写这样的东西:
[<DelimitedRecord(",")>]
type OneRow
( [<FieldConverter(ConverterKind.Date, "M/d/yyyy")>]
date:DateTime,
value:bool ) =
member x.Date = date
member x.Value = value
我相信这样做更好(通过将注释移动到构造函数中,您还可以在类型中实现自己的功能,例如隐藏一些字段)。唯一需要做的改变是修改解析器以查找构造函数参数(而不是字段)的属性。
答案 2 :(得分:0)
是的,它应该是type oneRow () =
括号
答案 3 :(得分:0)
根据错误消息,我认为如果将ctor添加到oneRow中它会起作用。
new () = { date = new DateTime() ; value = false}
答案 4 :(得分:0)
关于FileHelpers的大多数帖子都过时了。在某些情况下,虽然使用而不是csv类型提供程序很好。可以使用F#记录上的CLIMutable
属性来创建默认构造函数,在这种情况下,FileHelpers将很乐意编写和读取csv文件:
#if INTERACTIVE
#I @"..\packages\FileHelpers\lib\net45"
#r "FileHelpers.dll"
#endif
open FileHelpers
open System
[<DelimitedRecord(",");CLIMutable>]
type TestFileHelp =
{test1:string
test2:string
[<FieldConverter(ConverterKind.Date, "yyyy/MM/dd")>]
date:DateTime
}
let f1 = [|{test1="a";test2="b";date=DateTime.Now};{test1="c";test2="d";date=DateTime.Now}|]
let fengine = new FileHelperEngine<TestFileHelp>()
fengine.WriteFile(@"c:\tmp\testrec.csv",f1)