Haskell解析csv,并将标题添加到列表
haskell尝试获取一个带有标题(类型字符串)的int的csv文件,以将第2到第n行输出到列表列表中,这是一个新手。例如[[第1行],[第2行]…] 到目前为止,Pipes库让它以列表的形式输出每一行,数字作为字符串,出于某种原因,它打印“Right”?。例如输出:“右[“1”、“3”、“5”。]“新行”右[“32”、“38”、“45”]”。如有任何建议,将不胜感激。代码:Haskell解析csv,并将标题添加到列表,csv,haskell,list-comprehension,Csv,Haskell,List Comprehension,haskell尝试获取一个带有标题(类型字符串)的int的csv文件,以将第2到第n行输出到列表列表中,这是一个新手。例如[[第1行],[第2行]…] 到目前为止,Pipes库让它以列表的形式输出每一行,数字作为字符串,出于某种原因,它打印“Right”?。例如输出:“右[“1”、“3”、“5”。]“新行”右[“32”、“38”、“45”]”。如有任何建议,将不胜感激。代码: {-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-} impo
{-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-}
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
putStrLn "Filename? "
fName <- getLine
IO.withFile fName
IO.ReadMode
(\handle -> do
let producer = (PCsv.decode PCsv.NoHeader
(PB.fromHandle handle))
runEffect ( (producer)>->
(showPipe) >->
P.stdoutLn)
)
{-#语言重载字符串,ScopedTypeVariables}
导入符合条件的数据。向量为V
导入管道
进口合格管道。前奏部分为P
将合格的System.IO导入为IO
导入合格管道。通过测试环作为PB
导入符合条件的数据。文本作为文本
将合格管道.Csv导入为PCsv
进口管制.单子(永远)
showPipe::Proxy()(任意字符串(V.Vector Text.Text))()字符串IO b
showPipe=forever$do
x::(任意字符串(V.Vector Text.Text))->
(表演者)>->
P.stdoutLn)
)
我不熟悉管道
,但看起来您正在将数据拉入或,这通常使用右侧
构造函数表示数据,使用左侧
构造函数表示错误消息
data Either a b = Left a | Right b
在本例中,您正在构建一个任意字符串(V.Vector Text.Text)
,因此您的结果将是:
:: Left String
或
在本例中,您得到的是后者,并且希望显示从或monad中提取的值。您可以使用或同时处理这两种可能性(与maybe
单子中使用maybe
的方式大致相同)
无论是哪种(hyuk)方式,您都应该生成一个字符串
以在main
:: Right (V.Vector Text.Text)
showPipe :: Proxy () (Either String (V.Vector Text.Text)) () String IO b
showPipe = forever $ do
x::(Either String (V.Vector Text.Text)) <- await
let v = either id show x
yield v
either :: (a -> c) -> (b -> c) -> Either a b -> c
-- or, specialized for this case:
either :: (String -> String)
-> ((V.Vector Text.Text) -> String)
-> Either String (V.Vector Text.Text)
-> String