区切られたファイルをfparsecで解析する方法について、 Bill Casarinの投稿を使用しています。コードがどのように機能するかを理解するために、ロジックを理解しています。複数行で区切られたドキュメントを(今のところ)セルリストリスト構造に解析しています。ここで、セルは文字列または浮動小数点数です。私はこれについては完全な初心者です。
フロートの解析に問題があります-一般的なケース(タブによって配信されるセル、数値を含む)では機能します。ただし、セルがたまたま数字で始まる文字列である場合、セルはバラバラになります。
pFloatCellを変更して、(タブを通過する途中で)floatとして解析するか、何も解析しないようにするにはどうすればよいですか?
ありがとうございました
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列:3 \ r \n102011年3月18:28:11GMT\ r \ n ^ \ r \ n期待:ファイルの終わり、改行、または'\ t'\ r \ n"
試みはうまく機能しているように見えます。2番目のケースでは、10までしか取得できず、 pfloatのコードは最初の空白のみを検索します。前にスペースがあるかどうかに関係なく、次のタブまたは改行までずっと調べる必要があることをpfloatに納得させる必要があります。Double.Parseを実行して独自のバージョンのpfloatを作成しますが、ライブラリに依存したいと思います。