适用于Haskell的全功能CSV解析器?

时间:2011-01-23 12:07:38

标签: haskell csv

任何人都可以推荐使用以下选项解析CSV文件的方法:

  • 设置单元格/字段分隔符
  • 设置记录/行终止符的结尾
  • 为字段设置引号字符
  • 支持UTF-8字符串
  • 将内存中的CSV结构写回文件的能力

我确实尝试过Text.CSV,但它很简单,并且缺少上述大部分功能。 是否有一些更高级的CSV解析模块,还是我必须“从头开始”编写它,即使用Text.ParserCombinators?我不打算重新发明轮子。

小心。

5 个答案:

答案 0 :(得分:8)

我不推荐Haskell的现成的,打包的CSV解析器,但我记得书Real-World Haskell by Bryan O'Sullivan et al.包含Parsec的章节,作者通过创建CSV解析器。

相关的chapter 16: Using Parsec可在线获取;查看标题为扩展示例:完整CSV解析器的部分。

答案 1 :(得分:6)

这是一个旧线程,但csv-conduitcassava都有大部分(如果不是全部) - 不确定重写文件 - 您正在寻找的功能。

答案 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"