import Text.CSV import Text.Printf (printf) import Data.List (sort, isPrefixOf, groupBy) import System.Environment (getArgs) normAndInvertAmount :: Field -> Field normAndInvertAmount amt | amt == "" = "" | otherwise = printf "%.2f" (0 - (read amt :: Double)) compressWhitespace :: String -> String compressWhitespace x = map head $ groupSpaces x where groupSpaces "" = [""] groupSpaces x = groupBy (\x y -> x==' ' && y==' ') x massageAmount :: [Field] -> [Field] massageAmount [a,b,c,d,e,f,g,h,i,j] = [a,b,c,d,compressWhitespace e,f,g,h,i,normAndInvertAmount j] -- massageAmount [a,b,c,d,e,f,g,h] = [a,b,compressWhitespace c,d,e,f,g,normAndInvertAmount h] massageAmount xs = xs sanitySort :: [Record] -> [Record] sanitySort ts = map (massageAmount) (sort ts) main = do args <- getArgs result <- parseCSVFromFile (head args) case result of Left e -> putStrLn ("Parse fail: " ++ show e) Right ts -> putStrLn $ printCSV (sanitySort ts)