2017-03-31 60 views
0

我的代码如下。看起来数据以随机顺序输出,这很有意义,因为NamedRecord只是一个Map。有没有办法强制执行特定的命令?我可以使用NamedRecords设置conduit-CSV的列顺序吗?

我认为一种选择是创建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") 

回答

0

我最终只是把我自己的功能如下:

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 
相关问题