我可以使用 NamedRecords 设置 conduit-CSV 的列顺序吗?
Can I set the column order for conduit-CSV using 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")
我最终只是为此制作了自己的函数:
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
我的代码如下。似乎数据以随机顺序输出,这是有道理的,因为 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")
我最终只是为此制作了自己的函数:
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