首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FParsec:如何在fparsec中解析日期(新手)

FParsec:如何在fparsec中解析日期(新手)
EN

Stack Overflow用户
提问于 2011-04-12 03:17:10
回答 1查看 496关注 0票数 3

我正在使用关于如何使用fparsec解析分隔文件的比尔·卡萨林帖子,我正在简化逻辑,以了解代码的工作方式。我正在将多行分隔的文档解析为单元格列表列表结构(目前),其中单元格是字符串或浮点。在这方面我是个完全的新手。

我在解析浮点数时遇到了问题--在一个典型的情况下(一个由制表符分隔的单元格,包含一个数字),它可以工作。然而,当一个单元格碰巧是以数字开头的字符串时,它就会分崩离析。

我如何修改pFloatCell,以将其解析为浮点数(尽管通过选项卡的方式)或不解析?

谢谢

代码语言:javascript
复制
type Cell = 
    | String of string 
    | Float of float
.
.
.
let pStringCell delim = 
    manyChars (nonQuotedCellChar delim)
    |>> String

// this is my issue. pfloat parses the string one 
// char at a time, and once it starts off with a number 
// it is down that path, and errors out
let pFloatCell delim = 
    FParsec.CharParsers.pfloat
    |>> Float

let pCell delim = 
    (pFloatCell delim) <|> (pStringCell delim)
.
.
.
let ParseTab s  =
  let delim = "\t"
  let res = run (csv delim) s in
    match res with
     | Success (rows, _, _) -> { IsSuccess = true; ErrorMsg = "Ok"; Result = stripEmpty rows }
     | Failure (s, _, _) -> { IsSuccess = false; ErrorMsg = s; Result = [[]] }
.
.
.
let test() =

    let parsed = ParseTab data

昨晚我迟到了。我本打算把数据发出去的。第一个能工作的

代码语言:javascript
复制
let data = 
    "s10 Mar 2011 18:28:11 GMT\n"

当返回一个错误时:

代码语言:javascript
复制
let data = 
    "10 Mar 2011 18:28:11 GMT\n"

返回,包括ChaosP的建议和其他方面的建议:

ErrorMsg =“Ln: 1 Col: 3\r\n 2011年3月10日18:28:11 GMT\r^r\n nExpecting:文件结束、换行符或‘t’\r\n中的错误

看来这一尝试很成功。在第二种情况下,它只获取10,而pfloat的代码只显示到第一个空格。我需要确认pfloat需要一直查找到下一个选项卡或换行符,而不管它前面是否有空格;通过执行Double.Parse编写我自己的pfloat版本--但是我更愿意依赖于库。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-12 03:42:57

因为您将要解析的文本似乎有点模糊,所以您需要修改您的pCell解析器。

代码语言:javascript
复制
let sep delim =
     skipString delim <|> skipAnyOf "\r\n" <|> eof

let pCell delim = 
    attempt (pFloatCell delim .>> sep delim) <|> (pStringCell delim .>> sep delim)

这也意味着您需要修改任何使用pCell的解析器。

代码语言:javascript
复制
let pCells delim =
    many pCell delim 

Note

实际上,.>>运算符非常简单。把它想象成跳蛙操作符。在应用右侧并忽略结果后,返回左手侧的值。

代码语言:javascript
复制
Parser<'a, 'b> -> Parser<'c, 'b> -> Parser<'a, 'b>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5630012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档