在csv-conduit的github页面上找到的文档很少,我的用例涉及以csv格式读取字符串,即:
csv :: String
csv = "\"column1 (text)\",\"column2 (text)\",\"column3 (number)\",\"column4 (number)\"\r\anId,stuff,12,30.454\r\n"
并将其转换为某种中间数据类型,因此假设我们声明数据类型Row
,然后我就
csv' :: Row
csv' = Row (Just "anId") "stuff" 12 (Just 30.454)
但我不确定要拨打哪些功能。此外,似乎csv-conduit已经导出了一些Row
类型,但我不确定如何使用它?
答案 0 :(得分:1)
这是一个示例,显示如何在cvs管道管道中添加处理步骤。这里我们只为每个输入行添加一列。
{-# LANGUAGE NoMonomorphismRestriction, OverloadedStrings #-}
module Lib
where
import Data.Conduit
import Data.Conduit.Binary
import Data.CSV.Conduit
import Data.Text
import qualified Data.Map as Map
import Control.Monad
myProcessor :: Monad m => Conduit (MapRow Text) m (MapRow Text)
myProcessor = do
x <- await
case x of
Nothing -> return ()
Just m -> do let m' = Map.insert "asd" "qwe" m
yield m'
myProcessor
test = runResourceT $
sourceFile "input.csv" $=
intoCSV defCSVSettings $=
myProcessor $=
(writeHeaders defCSVSettings >> fromCSV defCSVSettings) $$
sinkFile "output.csv"
当然,您的处理阶段不必生成MapRow Text
项 - 它可以生成您想要的任何类型的项目。使用其他管道操作来收集/过滤/处理该管道。
如果您要执行特定任务,我可以解决此问题。