CSV是Comma-Separated Values ,依逗點分隔的值。
測試的樣本,要有一些代表性,
如:
Details,Month,Amount
Mid Bonus,June,"$2,000"
,January,"""zippo"""
Total Bonuses,"","$5,000"
其中**,January,"""zippo"""**,是合法的,第一欄沒有值,第三欄被多個雙引號包住。
而直接給值也是合法的,Mid Bonus,June, ,沒有雙引號包住也可以。
彈性挺大的。
設計的文法,
grammar CSV;
file : hdr row+ ;
hdr : row ;
row : field (',' field)* '\r'? '\n' ;
field
: TEXT
| STRING
|
;
TEXT : ~[,\n\r"]+ ;
STRING : '"' ('""'|~'"')* '"' ; // quote-quote is an escaped quote
這裏有些符號的意思,之前沒細講,
所謂的Lexer Rules,
把本文裏的字(WORD, token,或元素)切出來。
TEXT, STRING大寫是有意義的,表示他們是Tokens。不要誤用。
[裏面是放字元],~[字元] , 其中的**~** 是NOT,不在的意思,整個的意思,是不包含[]裏的字元。**+**表示一個以上。
表示0個以上。有細微的差異。
(裏面是子規則), subrules like (...)?, (...) and (...)+ are greedy。一些子規則是貪婪的。表示會讓解析程式判斷很久。
?問號代表前面的字元最多只可以出現一次。
這個部分和正規表達示,
常常會忘了這些符號所代表的意思,多查幾次就會記得。