【问题标题】:Remove rows with conduit-csv使用管道 csv 删除行
【发布时间】:2019-09-12 11:20:27
【问题描述】:

尝试使用 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)

【问题讨论】:

  • 这个问题可能会有所改善。 stackoverflow.com/help/mcve。您提到删除 4 行或 4 列,是什么? intoCSV 应该努力构建您的自定义类型,您只需要使用 getNamed 解开它。
  • 对不起4“行”! csv 占据了我的大脑

标签: csv haskell conduit


【解决方案1】:

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

类似下面的东西应该可以工作:

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

【讨论】:

    猜你喜欢
    • 2017-03-27
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    相关资源
    最近更新 更多