2017-03-31 7 views
0

私のコードは以下の通りです。データがランダムな順序で出力されるようですが、NamedRecordはちょうどMapなので意味があります。特定の注文を強制する方法はありますか?NamedRecordsを使用してconduit-CSVの列の順序を設定できますか?

1つのオプションは、タイプ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 
関連する問題