6

正如标题所说,我希望能够使用 zip-conduit 从 zip 存档中的文件中读取行(我正在处理的 zip 文件非常大,所以我需要能够做到这在不断的记忆中)。我理解了管道的基本概念,但从未在愤怒中使用过它们,并且对于从哪里开始感到很困惑。我已经阅读了管道教程,但我无法将其与我的问题相匹配。

zip-conduit 文档说可以通过以下方式从 zip 存档中获取资源:

import qualified Data.Conduit.Binary as CB
import Codec.Archive.Zip

withArchive archivePath $ do
    name:_ <- entryNames
    sourceEntry name $ CB.sinkFile name

我想我需要做的是写一些东西来代替CB.sinkFile. Data.Conduit.Text有一个lines功能——它可以以某种方式从文件中取出行吗?

我真的很感激一个简单的例子,比如说使用putStrLn写出一个简单的文本文件的行,该文件被归档在一个 zip 文件中。提前致谢。

4

3 回答 3

6

迈克尔的回答,但有zip-conduit

import           Control.Monad.IO.Class (liftIO)
import           Data.Conduit
import qualified Data.Conduit.List as CL
import qualified Data.Conduit.Text as CT
import           Codec.Archive.Zip

main :: IO ()
main = withArchive "input.zip" $ do
  n:_ <- entryNames
  sourceEntry n
     $ CT.decode CT.utf8
    =$ CT.lines
    =$ CL.mapM_ (\t -> liftIO $ putStrLn $ "Got a line: " ++ show t)
于 2013-11-22T20:03:26.470 回答
1

这是一个简单的例子:

import           Control.Monad.IO.Class (liftIO)
import           Data.Conduit
import qualified Data.Conduit.Binary    as CB
import qualified Data.Conduit.List      as CL
import qualified Data.Conduit.Text      as CT

main :: IO ()
main = runResourceT
     $ CB.sourceFile "input.txt"
    $$ CT.decode CT.utf8
    =$ CT.lines
    =$ CL.mapM_ (\t -> liftIO $ putStrLn $ "Got a line: " ++ show t)

您还可以在 FP Haskell Center 上查看和试验

于 2013-11-21T18:49:48.550 回答
1

这是一个简单的例子-

import Data.ByteString as B
import Data.Conduit
import qualified Data.Conduit.List as CL
import qualified Data.Conduit.Binary as CB
import Codec.Archive.Zip
import System.Environment

sink :: Monad m => Sink ByteString m [ByteString]
sink = CL.consume

main::IO()
main = do
    [archivePath] <- getArgs
    res <- withArchive archivePath $ do
        name:_ <- entryNames
        source <- getSource name
        runResourceT $ (source $$ sink)

    print res

您可以在接收器函数中处理通过的数据(使用 CL、CB 函数根据需要使用),或者由于数据是延迟返回的,您可以在 res 中修改数据。

于 2013-11-21T19:12:52.523 回答