假设我们创建文件 a.txt.gz
如下:
$ echo "foobar" > a.txt
$ gzip a.txt
我打算使用zlib-conduit
为了在 Haskell 中模拟 zcat
。
我正在寻找一个也可以应用于 bzlib-conduit
的简单示例.
注意:这个问题立即以问答形式得到回答。因此它故意不表现出任何研究成果。
最佳答案
如果您打算使用conduit
,我强烈建议您阅读优秀的Conduit overview by Michael Snoyman和 FP 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/