Если вы собираетесь работать с conduit
s, я настоятельно рекомендую прочитать отличный обзор канала. Майкл Снойман и Полное руководство по FP по этой теме первый.
Я включил свой флаг -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
документация< /a> содержит пример распаковки.
Обратите внимание, что вы не можете использовать decompress
для файлов, созданных gzip
. decompress
распаковывает .Z
файлов, созданных старой compress
программой UNIX.
После модификации приведенного выше примера мы получаем:
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
person
Uli Köhler
schedule
26.01.2014