Haskell bzlib-conduit / zlib-conduit示例

时间:2014-01-26 04:01:45

标签: haskell conduit zlib-conduit bzlib-conduit

假设我们按如下方式创建文件a.txt.gz

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

我打算使用zlib-conduit来模拟Haskell中的zcat

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

注意:此问题已在Q& A-Style中立即得到解答。因此,它故意不显示任何研究工作。

1 个答案:

答案 0 :(得分:2)

如果您打算使用conduit,我强烈建议您首先阅读有关此主题的优秀Conduit overview by Michael SnoymanFP Complete tutorial

我已打开-vv标志,使其适合Haskell初学者(就像我一样)。

你需要三件事:

  • 文件来源
  • zlib解压缩过滤器
  • stdout sink

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

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 decompressor缺失
  • 我们要输出到stdout,而不是output.txt

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

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

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

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