Haskell 的全功能 CSV 解析器?

发布于 2024-10-13 12:18:56 字数 291 浏览 2 评论 0 原文

任何人都可以推荐一种解析 CSV 文件的方法,其中包含以下选项:

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

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

小心。

Can anybody recommend a way to parse CSV files with options to:

  • set cells/fields separator
  • set end of record/row terminator
  • set quote-character for fields
  • support of UTF-8 strings
  • ability to write in-memory CSV structure back to a file

I did try Text.CSV but it's very simple and lacks most of the above features.
Is there some more advanced CSV parsing module or do I have to write it "from scratch" i.e. using Text.ParserCombinators? I do not intend to reinvent a wheel.

Take care.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

空气里的味道 2024-10-20 12:18:56

我不能推荐一个现成的、打包好的 Haskell CSV 解析器,但我记得这本书 Real-World Haskell 包含关于 的章节Parsec,作者通过创建 CSV 解析器来演示。

相关的第 16 章:使用 Parsec 可在线获取;检查标题为扩展示例:完整 CSV 解析器的部分。

I can't recommend a ready-to-go, packaged-up CSV parser for Haskell, but I remember that the book Real-World Haskell by Bryan O'Sullivan et al. contains a chapter on Parsec, which the authors demonstrate by creating a CSV parser.

The relevant chapter 16: Using Parsec is available online; check the section titled Extended Example: Full CSV Parser.

这个俗人 2024-10-20 12:18:56

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

This is an old thread, but both csv-conduit and cassava have most, if not all -- not sure about re-writing to the file -- of the features you're looking for.

誰認得朕 2024-10-20 12:18:56

快速搜索 Hackage 会发现 Data.Spreadsheet,它具有可自定义的引号和分隔符。

A quick search on Hackage finds Data.Spreadsheet, which does have customizable quote and separator.

£烟消云散 2024-10-20 12:18:56

hackage 上有 Data.Csv 模块。如果您的发行版没有提供它的软件包,您可以通过 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。值中的双引号用反斜杠引用,并且在“不需要”时省略引号。

There is the Data.Csv module on hackage. In case your distribution does not provide a package for it you can install it via cabal, e.g.

$ cabal install cassava

It can read and write (i.e. decode/encode) records from/to CSV files.

You can set the field separator like this:

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

Currently, Data.Csv does not offer other encode/decode options. There are function variants for working with a header row. As is, lines are terminated with CRLF, double-quotes are used for quoting and as text-encoding UTF8 is assumed. Double-quotes in values are quoted with a back-slash and quoting is omitted where it is 'not necessary'.

后来的我们 2024-10-20 12:18:56

木薯在内存中工作,是非常简单的库,例如

encode [("John" :: Text, 27), ("Jane", 28)]
"John,27\r\nJane,28\r\n"

Cassava works in memory and is very simple library e.g.

encode [("John" :: Text, 27), ("Jane", 28)]
"John,27\r\nJane,28\r\n"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文