2014-01-26 3 views
2

/Zlib-канал Давайте предположим, что мы создаем файл a.txt.gz следующим образом:Haskell bzlib-канал Пример

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

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

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

Примечание: Этот вопрос был немедленно отправлен в Q & A-Style. Поэтому он намеренно не показывает никаких исследований.

ответ

2

Если вы намереваетесь работать с 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 
Смежные вопросы