任何人都可以推荐使用以下选项解析CSV文件的方法:
我确实尝试过Text.CSV,但它很简单,并且缺少上述大部分功能。 是否有一些更高级的CSV解析模块,还是我必须“从头开始”编写它,即使用Text.ParserCombinators?我不打算重新发明轮子。
小心。
答案 0 :(得分:8)
我不推荐Haskell的现成的,打包的CSV解析器,但我记得书Real-World Haskell by Bryan O'Sullivan et al.包含Parsec的章节,作者通过创建CSV解析器。
相关的chapter 16: Using Parsec可在线获取;查看标题为扩展示例:完整CSV解析器的部分。
答案 1 :(得分:6)
这是一个旧线程,但csv-conduit和cassava都有大部分(如果不是全部) - 不确定重写文件 - 您正在寻找的功能。
答案 2 :(得分:4)
快速搜索Hackage查找Data.Spreadsheet,其中包含可自定义的引号和分隔符。
答案 3 :(得分:4)
hackage上有Data.Csv
module。如果您的发行版没有提供包装,您可以通过cabal安装它,例如
$ cabal install cassava
它可以从/向CSV文件读取和写入(即解码/编码)记录。
您可以像这样设置字段分隔符:
import Data.Csv
import Data.Char -- ord
import qualified Data.ByteString.Lazy.Char8 as B
enc_opts = defaultEncodeOptions {
encDelimiter = fromIntegral $ ord '\t'
}
write_csv vector = do
B.putStr $ encodeWith enc_opts vector
目前,Data.Csv
不提供其他编码/解码选项。有一些函数变体用于处理标题行。按原样,行以CRLF终止,双引号用于引用,并假设为文本编码UTF8。值中的双引号用反斜杠引用,并且在“不必要”的地方省略引号。
答案 4 :(得分:-1)
木薯在记忆中起作用,非常简单,例如
encode [("John" :: Text, 27), ("Jane", 28)]
"John,27\r\nJane,28\r\n"