【问题标题】:Haskell bzlib-conduit/zlib-conduit exampleHaskell bzlib-conduit/zlib-conduit 示例
【发布时间】:2014-01-26 04:01:44
【问题描述】:

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

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

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

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

注意:这个问题立即以问答形式回答。因此,它故意不显示任何研究成果。

【问题讨论】:

    标签: haskell conduit zlib-conduit bzlib-conduit


    【解决方案1】:

    如果您打算与conduits 合作,我强烈建议您先阅读关于此主题的优秀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 解压器丢失
    • 我们想输出到标准输出,而不是output.txt

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

    请注意,您不能将decompress 用于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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      相关资源
      最近更新 更多