+ hledger-dupes (originally from https://github.com/larsen/hledger-dupes) (#463)
This commit is contained in:
		
							parent
							
								
									7460aca70f
								
							
						
					
					
						commit
						e8003ea524
					
				
							
								
								
									
										51
									
								
								bin/hledger-dupes.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								bin/hledger-dupes.hs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | |||||||
|  | #!/usr/bin/env stack | ||||||
|  | {- stack runghc --verbosity info | ||||||
|  |    --package hledger-lib | ||||||
|  |    --package safe | ||||||
|  |    --package text | ||||||
|  | -} | ||||||
|  | {- | ||||||
|  | 
 | ||||||
|  | hledger-dupes [FILE] | ||||||
|  | 
 | ||||||
|  | Reports duplicates in the account tree: account names having the same leaf | ||||||
|  | but different prefixes. In other words, two or more leaves that are | ||||||
|  | categorized differently. | ||||||
|  | Reads the default journal file, or another specified as an argument. | ||||||
|  | 
 | ||||||
|  | http://stefanorodighiero.net/software/hledger-dupes.html | ||||||
|  | -} | ||||||
|  | 
 | ||||||
|  | import Hledger | ||||||
|  | import Text.Printf (printf) | ||||||
|  | import System.Environment (getArgs) | ||||||
|  | import Safe (headDef) | ||||||
|  | import Data.List | ||||||
|  | import Data.Function | ||||||
|  | import qualified Data.Text as T | ||||||
|  | 
 | ||||||
|  | accountsNames :: Journal -> [(String, AccountName)] | ||||||
|  | accountsNames j = map leafAndAccountName as | ||||||
|  |   where leafAndAccountName a = (T.unpack $ accountLeafName a, a) | ||||||
|  |         ps = journalPostings j | ||||||
|  |         as = nub $ sort $ map paccount ps | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | dupes :: (Ord k, Eq k) => [(k, v)] -> [(k, [v])] | ||||||
|  | dupes l = zip dupLeafs dupAccountNames | ||||||
|  |   where dupLeafs = map (fst . head) d | ||||||
|  |         dupAccountNames = map (map snd) d | ||||||
|  |         d = dupes' l | ||||||
|  |         dupes' = filter ((> 1) . length) | ||||||
|  |           . groupBy ((==) `on` fst) | ||||||
|  |           . sortBy (compare `on` fst) | ||||||
|  | 
 | ||||||
|  | render :: (String, [AccountName]) -> IO () | ||||||
|  | render (leafName, accountNameL) = printf "%s as %s\n" leafName (concat $ intersperse ", " (map T.unpack accountNameL)) | ||||||
|  | 
 | ||||||
|  | main = do | ||||||
|  |   args <- getArgs | ||||||
|  |   deffile <- defaultJournalPath | ||||||
|  |   let file = headDef deffile args | ||||||
|  |   j <- readJournalFile Nothing Nothing True file >>= either error' return | ||||||
|  |   mapM_ render $ dupes $ accountsNames j | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user