使用导管csv删除行

时间:2019-04-23 09:42:45

标签: csv haskell conduit

尝试使用csv文件并删除前4行,然后继续进行我的解析:

parsePowerCsv
  :: MonadThrow m
  => ConduitT () ByteString m () -> m [PowerFields]
parsePowerCsv bs = do
  runConduit $
       bs
      .| CL.consume
      .| (dropC 4 >> intoCSV defCSVSettings)

因此,我能够生成Text的列表,但由于我拥有PowerFields实例,但希望能够轻松转换为我的From/To NamedRecord类型,但我想先删除这些实例4行。

所以在dropC之后,我无法将[Text]解析为[PowerFields]

data PowerFields =
  PowerFields
    { VA_avg         :: Maybe Double
    , A_avg          :: Maybe Double
    , Wh_sum         :: Maybe Double
    ...
    } deriving (Eq, Show, Read)

1 个答案:

答案 0 :(得分:0)

由于intoCSV希望在整个文件中进行流传输,而不是读取行流,因此,您将需要使用可以直接从输入字节串流中解析和删除行的管道,而不是尝试处理行列表。

类似以下的方法应该起作用:

parsePowerCsv bs = do
  runConduit $
      bs
      .| (replicateM_ 4 (lineAsciiC sinkNull) >>
          intoCSV defCSVSettings)
      .| sinkList -- (dropC 4 >> sinkList)