Можно ли установить порядок столбцов для conduit-CSV с помощью NamedRecords?

Мой код ниже. Похоже, что данные выводятся в случайном порядке, что имеет смысл, поскольку NamedRecord — это просто Map. Есть ли способ, которым я могу обеспечить выполнение определенного приказа?

Я думаю, что одним из вариантов является создание канала типа Conduit (Named a) m (Row Text), но похоже, что это достаточно распространенный вариант использования, и что-то стандартное уже должно существовать.

processor :: Monad m => Conduit (Named FalconRow) m (Named HefRow)
processor = do
  value <- await 
  case value of
    Nothing -> return ()
    Just v -> do
      let transformed = (fixRow . getNamed) v
      CL.sourceList $ Prelude.map Named transformed

runTranslation :: IO ()
runTranslation = runResourceT $ 
  transformCSV defCSVSettings 
               (sourceFile "input.csv") 
               processor
               (sinkFile "output.csv")

person Xodarap    schedule 31.03.2017    source источник


Ответы (1)


В итоге я просто сделал свою собственную функцию для этого:

sortColumns :: (Monad m, DefaultOrdered a, ToNamedRecord a) => Conduit (Named a) m (Row ByteString)
sortColumns = CL.map doSort

doSort :: (DefaultOrdered a, ToNamedRecord a) => Named a -> Row ByteString
doSort value =
  let columnMap = toNamedRecord $ getNamed value
      headers = toList $ headerOrder $ getNamed value
      bsValue = map (\title -> findWithDefault "" title columnMap) headers
  in  bsValue
person Xodarap    schedule 05.04.2017