Пример Haskell bzlib-conduit/zlib-conduit

Предположим, мы создали файл a.txt.gz следующим образом:

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

Я намерен использовать zlib-conduit для эмуляции zcat в Haskell.

Я ищу простой пример, который также можно применить к bzlib-conduit.

Примечание. На этот вопрос сразу же был дан ответ в стиле вопросов и ответов. Поэтому он намеренно не показывает каких-либо исследовательских усилий.


person Uli Köhler    schedule 26.01.2014    source источник


Ответы (1)


Если вы собираетесь работать с conduits, я настоятельно рекомендую прочитать отличный обзор канала. Майкл Снойман и Полное руководство по 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