Удалить строки с помощью wire-csv - PullRequest
3 голосов
/ 23 апреля 2019

пытается использовать 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 голосов
/ 26 апреля 2019

Поскольку intoCSV ожидает потоковую передачу по всему файлу, а не считывание потока строк, вам нужно использовать канал, который может анализировать и отбрасывать строки непосредственно из входного потока тестовых строк, а не пытаться работать с ним. список строк.

Должно работать что-то вроде следующего:

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