我正在使用关于如何使用 fparsec 解析分隔文件的Bill Casarin帖子,我正在简化逻辑以了解代码的工作原理。我正在将多行分隔的文档解析为单元格列表结构(目前),其中单元格是字符串或浮点数。我是这方面的新手。
我在解析浮点数时遇到问题 - 在典型情况下(由制表符分隔的单元格,包含数字)它可以工作。然而,当一个单元格恰好是一个以数字开头的字符串时 - 它就会分崩离析。
如何修改 pFloatCell 以将(尽管通过选项卡)解析为浮点数或什么都不解析?
谢谢
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
哎呀昨晚我迟到了。我的意思是发布数据。这第一个有效
let data =
"s10 Mar 2011 18:28:11 GMT\n"
虽然这会返回一个错误:
let data =
"10 Mar 2011 18:28:11 GMT\n"
返回,无论是否有 ChaosP 的推荐:
ErrorMsg = "Ln 中的错误:1 Col: 3\r\n2011 年 3 月 10 日 18:28:11 GMT\r\n ^\r\n预期:文件结尾、换行符或 '\t'\r\n"
看起来尝试工作正常。在第二种情况下,它只抓取到 10 - 并且pfloat 的代码只查找到第一个空格。我需要说服 pfloat 它需要一直查找到下一个选项卡或换行符,无论它之前是否有空格;通过执行 Double.Parse 编写我自己的 pfloat 版本 - 但我宁愿依赖库。