假设我们按如下方式创建文件a.txt.gz
:
$ echo "foobar" > a.txt
$ gzip a.txt
我打算使用zlib-conduit
来模拟Haskell中的zcat
。
我正在寻找一个也可以应用于bzlib-conduit
的简单示例。
注意:此问题已在Q& A-Style中立即得到解答。因此,它故意不显示任何研究工作。
答案 0 :(得分:2)
如果您打算使用conduit
,我强烈建议您首先阅读有关此主题的优秀Conduit overview by Michael Snoyman和FP Complete tutorial。
我已打开-vv
标志,使其适合Haskell初学者(就像我一样)。
你需要三件事:
让我们从这个简单的文件复制示例开始:
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
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