From 6a7cc212a70393fd96305ff1441d114ba94cd826 Mon Sep 17 00:00:00 2001 From: Clint Adams Date: Wed, 22 Apr 2015 14:59:47 -0400 Subject: commit amex sanitation scripts --- sort-and-sanitize-amex-export.hs | 45 ++++++++++++++++++++++ sort-and-sanitize-the-other-kind-of-amex-export.hs | 30 +++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 sort-and-sanitize-amex-export.hs create mode 100644 sort-and-sanitize-the-other-kind-of-amex-export.hs diff --git a/sort-and-sanitize-amex-export.hs b/sort-and-sanitize-amex-export.hs new file mode 100644 index 0000000..f0be45c --- /dev/null +++ b/sort-and-sanitize-amex-export.hs @@ -0,0 +1,45 @@ +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) diff --git a/sort-and-sanitize-the-other-kind-of-amex-export.hs b/sort-and-sanitize-the-other-kind-of-amex-export.hs new file mode 100644 index 0000000..adeac06 --- /dev/null +++ b/sort-and-sanitize-the-other-kind-of-amex-export.hs @@ -0,0 +1,30 @@ +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) -- cgit v1.2.1