Haskell bzlib-conduit/zlib-conduit 示例

标签 haskell conduit zlib-conduit bzlib-conduit

假设我们创建文件 a.txt.gz 如下:

$ echo "foobar" > a.txt
$ gzip a.txt

我打算使用zlib-conduit为了在 Haskell 中模拟 zcat

我正在寻找一个也可以应用于 bzlib-conduit 的简单示例.

注意:这个问题立即以问答形式得到回答。因此它故意不表现出任何研究成果。

最佳答案

如果您打算使用conduit,我强烈建议您阅读优秀的Conduit overview by Michael SnoymanFP Complete tutorial首先讨论这个话题。

我已经打开了 -vv 标志,使其适合 Haskell 初学者(比如我自己)。

你需要三件事:

  • 文件源
  • zlib 解压过滤器
  • 标准输出接收器

让我们从这个简单的文件复制示例开始:

import Data.Conduit (runResourceT, ($$))
import qualified Data.Conduit.Binary as CB
import Data.Conduit.Zlib

main = do
    runResourceT $ CB.sourceFile "input.txt" $$ CB.sinkFile "output.txt"

这里我们需要修改什么?

  • 输入文件名不是a.txt.gz
  • zlib 解压缩器丢失
  • 我们想要输出到 stdout,而不是 output.txt

确实是decompress documentation包含如何解压缩的示例。

请注意,您无法对 gzip 生成的文件使用解压缩decompress 解压缩旧 compress UNIX 程序生成的 .Z 文件。

修改上面的例子后我们得到:

import Data.Conduit (runResourceT, ($$), ($=))
import qualified Data.Conduit.Binary as CB
import Data.Conduit.Zlib
import System.IO

main = do
    runResourceT $ CB.sourceFile "a.txt.gz" $= ungzip $$ CB.sinkHandle stdout

使用bzlib-conduit时的差异很小:

import Data.Conduit (runResourceT, ($$), ($=))
import qualified Data.Conduit.Binary as CB
import Data.Conduit.BZlib
import System.IO

main = do
    runResourceT $ CB.sourceFile "a.txt.bz2" $= bunzip2 $$ CB.sinkHandle stdout

关于Haskell bzlib-conduit/zlib-conduit 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21359525/

相关文章:

haskell - 如何使用reader monad的函数实例?

Haskell:使用 Data.Text.replace 仅替换第一次出现的文本值

haskell - 如何避免堆栈空间溢出?

Haskell:GHC 无法推断类型。由类型签名错误绑定(bind)的刚性类型变量

haskell - 从 Network.HTTP.Enumerator 迁移到 Network.HTTP.Conduit

c# - Phabricator conduit.connect C# 证书错误

haskell - 将 http-conduit 连接到 xml-conduit