Если вы намереваетесь работать с conduit
, я настоятельно рекомендую прочитать отличные Conduit overview by Michael Snoyman и FP Complete tutorial на эту тему.
Я включил свой флаг -vv
, чтобы сделать его подходящим для начинающих Haskell (как и я).
Вам нужны три вещи:
- Файл источник
- Zlib декомпрессия фильтр
- STDOUT раковина
Давайте начнем с этого простого примера копирования файла:
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"
Wh здесь нам нужно изменить здесь?
- ввода имени файла не
a.txt.gz
- Zlib декомпрессор отсутствует
- Мы хотим вывести на стандартный вывод, а не
output.txt
Действительно decompress
documentation содержит пример того, как распаковывать.
Отметьте, что вы не можете использовать decompress
для gzip
-генерированных файлов. decompress
распаковывает .Z
файлов, генерированных старым compress
UNIX program.
После изменения приведенного выше примера получим:
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