私はpipes-csvライブラリを使ってcsvファイルを読んでいます。私は最初の行を読んで後で残りを読んでみたい。残念ながら、Pipes.Prelude.head関数が返った後。パイプは何とか閉じられています。最初にcsvの頭を読んで後で残りの部分を読む方法がありますか?我々は最初のヘッダを読んでいない場合はpcs-csvを使ってcsvファイルから最初の行を読み取る
import qualified Data.Vector as V
import Pipes
import qualified Pipes.Prelude as P
import qualified System.IO as IO
import qualified Pipes.ByteString as PB
import qualified Data.Text as Text
import qualified Pipes.Csv as PCsv
import Control.Monad (forever)
showPipe :: Proxy() (Either String (V.Vector Text.Text))() String IO b
showPipe = forever $ do
x::(Either String (V.Vector Text.Text)) <- await
yield $ show x
main :: IO()
main = do
IO.withFile "./test.csv"
IO.ReadMode
(\handle -> do
let producer = (PCsv.decode PCsv.NoHeader (PB.fromHandle handle))
headers <- P.head producer
putStrLn "Header"
putStrLn $ show headers
putStrLn $ "Rows"
runEffect (producer>->
(showPipe) >->
P.stdoutLn)
)
、我々は何の問題もなく全体csvファイルを読むことができます:
main :: IO()
main = do
IO.withFile "./test.csv"
IO.ReadMode
(\handle -> do
let producer = (PCsv.decode PCsv.NoHeader (PB.fromHandle handle))
putStrLn $ "Rows"
runEffect (producer>->
(showPipe) >->
P.stdoutLn)
)
P.nextは、私の場合のための知事の溶液でした。また、showPipeのマップバージョンを表示していただきありがとうございます。 – yilmazhuseyin
また、P.concatでEitherを削除するのは本当に素晴らしいトリックでした。 – yilmazhuseyin