extra/hledger-print-csv: CSV export for hledger
This commit is contained in:
		
							parent
							
								
									455de6531d
								
							
						
					
					
						commit
						c7a2126896
					
				
							
								
								
									
										74
									
								
								extra/hledger-print-csv.hs
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										74
									
								
								extra/hledger-print-csv.hs
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,74 @@ | |||||||
|  | #!/usr/bin/env runhaskell | ||||||
|  | {-| | ||||||
|  | hledger-print-csv [-f JOURNALFILE] | ||||||
|  | 
 | ||||||
|  | Print matched journal entries as CSV | ||||||
|  | Reads the default or specified journal. | ||||||
|  | |-} | ||||||
|  | 
 | ||||||
|  | import Hledger.Cli | ||||||
|  | import Text.CSV | ||||||
|  | import Data.Char (isSpace) | ||||||
|  | import Data.List (mapAccumL) | ||||||
|  | 
 | ||||||
|  | argsmode :: Mode RawOpts | ||||||
|  | argsmode = (defCommandMode ["print-csv"]) | ||||||
|  | 	{ modeHelp = "print matched journal entries as CSV" | ||||||
|  | 	, modeGroupFlags = Group | ||||||
|  | 		{ groupNamed = | ||||||
|  | 			[ ("Input",inputflags) | ||||||
|  | 			, ("Reporting",reportflags) | ||||||
|  | 			, ("Misc",helpflags) | ||||||
|  | 			] | ||||||
|  | 		, groupUnnamed = [] | ||||||
|  | 		, groupHidden = [] | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | chomp :: String -> String | ||||||
|  | chomp = reverse . dropWhile isSpace . reverse . dropWhile isSpace | ||||||
|  | 
 | ||||||
|  | postingToCSV :: Posting -> CSV | ||||||
|  | postingToCSV p = | ||||||
|  | 	map (\(a@(Amount {aquantity=q,acommodity=c})) -> | ||||||
|  | 		let a_ = a{acommodity=""} in | ||||||
|  | 		let amount = showAmount a_ in | ||||||
|  | 		let commodity = c in | ||||||
|  | 		let credit = if q < 0 then showAmount $ negate a_ else "" in | ||||||
|  | 		let debit  = if q > 0 then showAmount a_ else "" in | ||||||
|  | 		account:amount:commodity:credit:debit:status:comment:[]) | ||||||
|  | 	 amounts | ||||||
|  | 	where | ||||||
|  | 		Mixed amounts = pamount p | ||||||
|  | 		status = if pstatus p then "*" else "" | ||||||
|  | 		account = showAccountName Nothing (ptype p) (paccount p) | ||||||
|  | 		comment = chomp $ pcomment p | ||||||
|  | 
 | ||||||
|  | postingsToCSV :: [Posting] -> CSV | ||||||
|  | postingsToCSV ps = | ||||||
|  | 	concatMap postingToCSV ps | ||||||
|  | 
 | ||||||
|  | transactionToCSV :: Integer -> Transaction -> CSV | ||||||
|  | transactionToCSV n t = | ||||||
|  | 	map (\p -> show n:date:date2:status:code:description:comment:p) | ||||||
|  | 	 (postingsToCSV (tpostings t)) | ||||||
|  | 	where | ||||||
|  | 		description = tdescription t | ||||||
|  | 		date = showDate (tdate t) | ||||||
|  | 		date2 = maybe "" showDate (tdate2 t) | ||||||
|  | 		status = if tstatus t then "*" else "" | ||||||
|  | 		code = tcode t | ||||||
|  | 		comment = chomp $ tcomment t | ||||||
|  | 
 | ||||||
|  | main :: IO () | ||||||
|  | main = do | ||||||
|  | 	opts <- getCliOpts argsmode | ||||||
|  | 	withJournalDo opts $ | ||||||
|  | 	 \CliOpts{reportopts_=ropts} j -> do | ||||||
|  | 		d <- getCurrentDay | ||||||
|  | 		let ropts_ = ropts{flat_=True} | ||||||
|  | 		let q = queryFromOpts d ropts_ | ||||||
|  | 		putStrLn $ printCSV $ concat $ | ||||||
|  | 			([["nth","date","date2","status","code","description","comment","account","amount","commodity","credit","debit","status","posting-comment"]]:).snd $ | ||||||
|  | 				mapAccumL (\n e -> (n + 1, transactionToCSV n e)) 0 $ | ||||||
|  | 					entriesReport ropts_ q j | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user