.net 解析F中分隔符分隔的值
我正在分析此表单中的字符串记录:.net 解析F中分隔符分隔的值,.net,parsing,f#,text-parsing,.net,Parsing,F#,Text Parsing,我正在分析此表单中的字符串记录: description: double/double/double 例如: item description: 0.4/8/-24.66 每个记录应产生一个对象: new MyObj("first item", 0.4, 2.4, -24.66) 我可以很容易地用正则表达式和过程方法来实现这一点,但生成的代码容易出错,至少从函数的角度来看相当难看 如何以更优雅的方式实现这一点?好吧,FParsec很好: #r "FParsecCS.dll" #r "FPa
description: double/double/double
例如:
item description: 0.4/8/-24.66
每个记录应产生一个对象:
new MyObj("first item", 0.4, 2.4, -24.66)
我可以很容易地用正则表达式和过程方法来实现这一点,但生成的代码容易出错,至少从函数的角度来看相当难看
如何以更优雅的方式实现这一点?好吧,FParsec很好:
#r "FParsecCS.dll"
#r "FParsec.dll"
open FParsec
let parser : Parser<_,unit> =
sepBy pfloat (pchar '/')
然后运行解析器0.4/8//-24.66返回val-it:ParserResult=Success:[0.4;8.0;-24.66]。或者您可以创建一个简单的解析器函数字符串->MyObj,如下所示:
type MyObj(descr:string, a:float, b:float, c:float) =
override this.ToString() =
System.String.Format("{0}: {1}; {2}; {3}", descr,a,b,c)
let myobjfromstr (str:string) =
let flds = str.Split([|':';'/'|])
let ip s = System.Double.Parse(s)
new MyObj(flds.[0], ip flds.[1], ip flds.[2], ip flds.[3])
myobjfromstr "item description: 0.4/8/-24.66" |> printfn "%A"
更新:我猜记录被一个新行或类似的东西隔开,并被分成一个列表。再想一想,你的问题中没有类似的内容…看起来不错,只是我还需要记录的第一部分,冒号之前的字符串。我还对不使用外部LIB的解决方案感兴趣。对于第一部分,您可以执行许多字符notAnyOf[':']。>>skipChar':'。对于不使用外部libs,不要使用FParsec:简单但有效,我喜欢它!记录之间用换行符分隔,很抱歉没有提及。@FrancescoDeVittori,还值得注意的是,可以创建一个类似string->seq的函数,这是非常F-esque的函数。另外,Don Syme在他的书中写道,您不应该害怕可变字段和过程方法,只要它能给您必要的性能提升,并且很好地隐藏在函数或类型中。。。希望这有帮助。