doc: clarify csv rules application order
This commit is contained in:
		
							parent
							
								
									f92590f92c
								
							
						
					
					
						commit
						3e5f0e8dd5
					
				@ -292,6 +292,37 @@ This will generate a [balance assertion](journal.html#balance-assertions)
 | 
				
			|||||||
(or if the amount is left empty, a [balance assignment](journal.html#balance-assignments)),
 | 
					(or if the amount is left empty, a [balance assignment](journal.html#balance-assignments)),
 | 
				
			||||||
on the appropriate posting, whenever the running balance field is non-empty.
 | 
					on the appropriate posting, whenever the running balance field is non-empty.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## References to other fields and evaluation order
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Field assignments could include references to other fields or even to the same field you are trying to assign:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					fields date,description,currency,amount1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					amount1 %amount1 USD
 | 
				
			||||||
 | 
					amount1 %amount1 EUR
 | 
				
			||||||
 | 
					amount1 %amount1 %currency
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if SOME_REGEXP
 | 
				
			||||||
 | 
					    amount1 %amount1 GBP
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					This is how this file would be evaluated.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					First, parts of CVS record are assigned according to `fields` directive.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Then all other field assignments -- written at top level, or included in `if` blocks -- are considered to see if they should be applied. They are checked in the order they are written, with later assignment overwriting earlier ones.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Once full set of field assignments that should be applied is known, their values are computed, and this is when all `%<fieldname>` references are evaluated.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					So for a particular row from CSV file, value from fourth column would be assigned to `amount1`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Then `hledger` will decide that `amount1` would have to be amended to `%amount1 USD`, but this will not happen immediately. This choice would be replaced by decision to rewrite `amount1` to `%amount EUR`, which will in turn be thrown away in favor of `%amount1 %currency`. If the `if` block condition will match the row, it will assign `amount1` to `%amount1 GBP`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Overall, we will end up with one of the two alternatives for `amount1` - either `%amount1 %currency` or `%amount1 GBP`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Now substitution of all referenced values will happen, using the current values for `%amount1` and `currency`, which were provided by the `fields` directive.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Reading multiple CSV files
 | 
					## Reading multiple CSV files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
You can read multiple CSV files at once using multiple `-f` arguments on the command line,
 | 
					You can read multiple CSV files at once using multiple `-f` arguments on the command line,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user