import Text.CSV import Text.Printf (printf) import Data.List (sort, isPrefixOf, groupBy) import System.Environment (getArgs) normAmount :: Field -> Field normAmount amt | amt == "" = "" | otherwise = printf "$%.2f" (read amt :: Double) compressWhitespace :: String -> String compressWhitespace x = map head $ groupSpaces x where groupSpaces "" = [""] groupSpaces x = groupBy (\x y -> x==' ' && y==' ') x mungePayment :: Field -> Field mungePayment x | x == "PAYMENT RECEIVED - THANK YOU" = "Assets:Bank:SFLC:Checking:FirstRepublic" | isPrefixOf "FEDEX# " x = "Expenses:Office & Postage:FedEx" | isPrefixOf "JUNCTION NETWORKS " x = "Expenses:Telephony:VoIP:Junction" | isPrefixOf "T-MOBILE" x = "Expenses:Telephony:Mobile:T-Mobile" | isPrefixOf "SPEAKEASY SEATTLE WA" x = "Expenses:Internet:Speakeasy" | isPrefixOf "TELIAX " x = "Expenses:Telephony:VoIP:Teliax" | isPrefixOf "VERIZON" x = "Expenses:Telephony:PSTN:Verizon" | isPrefixOf "VOICEPULSE " x = "Expenses:Telephony:VoIP:VoicePulse" | otherwise = "Expenses:Raw:" ++ compressWhitespace x newDesc :: String -> String -> String newDesc merch refno = compressWhitespace merch ++ parenRef refno where parenRef r | "Reference: " `isPrefixOf` r = concat [" (",drop 11 r,")"] | otherwise = concat [" (",r,")"] massageMerchant :: [Field] -> [Field] massageMerchant [a,b,c,d,e] = [a,newDesc d b,normAmount c,"",e] massageMerchant xs = xs sanitySort :: [Record] -> [Record] sanitySort ts = map (massageMerchant) (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)