gpt4 book ai didi

haskell - Parsec csv 解析器解析额外的行

转载 作者:行者123 更新时间:2023-12-04 05:38:20 24 4
gpt4 key购买 nike

我已经定义了以下 Parsec 解析器,用于将 csv 文件解析为字符串表,即 [[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

我真的不知道这些评论是否太多且令人讨厌,或者它们是否有帮助。作为 Parsec 菜鸟,他们会帮助我,所以我想我会添加他们。

它工作得很好,但有一个问题。它在表中创建一个额外的空行。例如,如果我有一个包含 10 行(即只有 10 行。最后没有空行*)的 csv 文件, [[String]]结构的长度为 11,最后一个列表为 String s 将包含 1 个元素。一个空 String (至少这是使用 show 打印时的显示方式)。

我的主要问题是:为什么会出现这个额外的行,我该怎么做才能阻止它?

我注意到的另一件事是,如果 csv 文件中的数据后面有空行,这些行最终将成为仅包含空 String 的行。在表中。我认为使用 sepEndBy而不是 sepBy会忽略多余的空行。不是这样吗?

*在十六进制编辑器中查看文本文件后,它似乎确实以换行符结尾,即使 vim 没有显示它...

最佳答案

如果你希望每一行至少有一个单元格,你可以使用 sepBy1而不是 sepBy .这也应该停止将空行解析为一行。 sepBy的区别和 sepBy1many的区别相同和 many1 : 1 version 仅解析至少一个元素的序列。所以row变成这样:

row = sepBy1 cell (char ',')

另外,通常的样式是使用 sepBy1中缀: cell `sepBy1` char ',' .这读起来更自然:你有一个“用逗号分隔的单元格”而不是“用逗号分隔的单元格”。

编辑:如果您不想接受空单元格,则必须指定 ncell至少有一个字符使用 many1 :
ncell = many1 (escChar <|> noneOf ",\n")

关于haskell - Parsec csv 解析器解析额外的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11618919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com