1

これらは私が定義した関数です(内部で使用される他の関数はテストされ、正常に動作します):

qstring : 二重引用符 (") を含まない文字列を受け入れます。

val qstring : string parser = (many (sat (fn c => not (c = #"\"")))) >>= (fn cs => 
          return (String.implode cs))

sepBy : 2 つのパーサーを入力として受け取るパーサーを受け取るパーサー。最初のものは区切り記号に一致し、2 番目のものはコンテンツに一致します。

val sepBy1 = fn s => fn p => p >>= (fn v1 => many (s >>= (fn _ => 
                 p >>= (fn v2 => return v2))) >>= (fn v2 => 
                             return (v1::v2)))

val sepBy = fn s => fn p => (sepBy1 s p) +++ (return [])

val csvline : record parser = sepBy1 (ch #",") field >>= 
                             (fn l => newline >>= (fn _ => return l))

val csvfile : csvfile parser = many csvline

入力例:

val csvEx = "\"John Smith\",72,1782,\"Colon, Cristobal\"\n198,2,3,4,5,64434,\"two\"\n"

文字列を解析する場所の代わりに # を取得します。ヒントはありますか?

- parse csvfile csvEx;
val it =
SOME
    ([[String #,Number #,Number #,String #],
     [Number #,Number #,Number #,Number #,Number #,Number #,
     String #]],"") : (csvfile * string) option
4

1 に答える 1

1

ここでは SML/NJ を使用していると思います。これは、NJ のプリティ プリンターの限界にすぎません。設定

Control.Print.printDepth := 20  (* or whatever *)

持ち上げるべきです。

于 2013-02-18T08:08:45.713 に答える