csv-conduit能否以csv形式读取字符串并将其解析为某种中间数据类型?

时间:2015-08-22 18:17:36

标签: parsing csv haskell conduit

在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类型,但我不确定如何使用它?

1 个答案:

答案 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项 - 它可以生成您想要的任何类型的项目。使用其他管道操作来收集/过滤/处理该管道。

如果您要执行特定任务,我可以解决此问题。