csvファイルを文字列のテーブルに解析するための次のParsecパーサーを定義しました。[[String]]
--A csv parser is some rows seperated, and possibly ended, by a newline charater
csvParser = sepEndBy row (char '\n')
--A row is some cells seperated by a comma character
row = sepBy cell (char ',')
--A cell is either a quoted cell, or a normal cell
cell = qcell <|> ncell
--A normal cell is a series of charaters which are neither , or newline. It might also be an escape character
ncell = many (escChar <|> noneOf ",\n")
--A quoted cell is a " followd by some characters which either are escape charaters or normal characters except for "
qcell = do
char '"'
res <- many (escChar <|> noneOf "\"")
char '"'
return res
--An escape character is anything followed by a \. The \ will be discarded.
escChar = char '\\' >> anyChar
コメントが多すぎて迷惑なのか、助けになっているのか、よくわかりません。パーセクの初心者として、彼らは私を助けてくれるので、私はそれらを追加しようと思いました.
それはかなりうまく機能しますが、問題があります。テーブルに余分な空の行が作成されます。したがって、たとえば、10 行 (つまり、10 行のみ。最後に空の行はありません*) の csv ファイルがある場合、[[String]]
構造の長さは 11 になり、s の最後のリストにString
は 1 つの要素が含まれます。空String
(少なくとも、 を使用して印刷すると、このように表示されますshow
)。
私の主な質問は、この余分な行が表示されるのはなぜですか?それを止めるにはどうすればよいですか?
私が指摘したもう1つのことは、csvファイルのデータの後に空の行がある場合、これらはString
テーブルに空の行のみを含む行として終了することです. sepEndBy
の代わりに使用sepBy
すると、余分な空行が無視されると思いました。そうではありませんか?
*16進エディタでテキストファイルを見た後、vimがそれを表示していなくても、実際には実際には改行文字で終わっているようです...