3

区切られたファイルを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を作成しますが、ライブラリに依存したいと思います。

4

1 に答える 1

2

解析しようとしているテキストがあいまいなように思われるので、pCellパーサーを変更する必要があります。

let sep delim =
     skipString delim <|> skipAnyOf "\r\n" <|> eof

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

これは、使用するパーサーを変更する必要があることも意味しますpCell

let pCells delim =
    many pCell delim 

ノート

.>>オペレーターは実際には非常に単純です。リープフロッグ演算子のように考えてください。左辺の値は、右辺を適用して結果を無視した後に返されます。

Parser<'a, 'b> -> Parser<'c, 'b> -> Parser<'a, 'b>
于 2011-04-12T03:42:57.560 に答える