2

Let's assume we create the file a.txt.gz as follows:

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

I intend to use zlib-conduit in order to emulate zcat in Haskell.

I'm looking for a simple example that can also be applied to bzlib-conduit.

Note: This question was answered immediately in a Q&A-Style. Therefore it intentionally does not show any research effort.

4

1 回答 1

2

如果您打算使用conduits,我强烈建议您先阅读Michael Snoyman 撰写的出色的 Conduit 概述和有关此主题的FP Complete 教程。

我已经打开了我的-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 解压器丢失
  • 我们想输出到标准输出,而不是output.txt

实际上,该decompress文档包含一个如何解压缩的示例。

请注意,您不能使用decompressforgzip生成的文件。decompress解压缩.ZcompressUNIX 程序生成的文件。

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

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
于 2014-01-26T04:01:44.533 回答