mirror of
https://github.com/simonmichael/hledger.git
synced 2024-09-20 02:37:12 +03:00
lib, doc: extended "skip" in "if" body to "skip N"
This commit is contained in:
parent
f877a7789f
commit
f1ab107400
@ -218,10 +218,19 @@ printCSV records = unlined (printRecord `map` records)
|
||||
-- | Return the cleaned up and validated CSV data (can be empty), or an error.
|
||||
validateCsv :: CsvRules -> Int -> Either String CSV -> Either String [CsvRecord]
|
||||
validateCsv _ _ (Left err) = Left err
|
||||
validateCsv rules numhdrlines (Right rs) = validate $ filter (not.shouldSkip) $ drop numhdrlines $ filternulls rs
|
||||
validateCsv rules numhdrlines (Right rs) = validate $ applyConditionalSkips $ drop numhdrlines $ filternulls rs
|
||||
where
|
||||
filternulls = filter (/=[""])
|
||||
shouldSkip r = isJust $ getEffectiveAssignment rules r "skip"
|
||||
skipCount r =
|
||||
case getEffectiveAssignment rules r "skip" of
|
||||
Nothing -> Nothing
|
||||
Just "" -> Just 1
|
||||
Just x -> Just (read x)
|
||||
applyConditionalSkips [] = []
|
||||
applyConditionalSkips (r:rest) =
|
||||
case skipCount r of
|
||||
Nothing -> r:(applyConditionalSkips rest)
|
||||
Just cnt -> applyConditionalSkips (drop (cnt-1) rest)
|
||||
validate [] = Right []
|
||||
validate rs@(_first:_)
|
||||
| isJust lessthan2 = let r = fromJust lessthan2 in
|
||||
|
@ -92,7 +92,7 @@ You'll need this whenever your CSV data contains header lines. Eg:
|
||||
<!-- XXX -->
|
||||
<!-- hledger tries to skip initial CSV header lines automatically. -->
|
||||
<!-- If it guesses wrong, use this directive to skip exactly N lines. -->
|
||||
This can also be used in a conditional block (without numeric argument) to ignore certain CSV records.
|
||||
This can also be used in a conditional block to ignore certain CSV records.
|
||||
```rules
|
||||
# ignore the first CSV line
|
||||
skip 1
|
||||
@ -178,12 +178,12 @@ Note, interpolation strips any outer whitespace, so a CSV value like
|
||||
## conditional block
|
||||
|
||||
`if` *`PATTERN`*\
|
||||
*`FIELDASSIGNMENTS or skip`*...
|
||||
*`FIELDASSIGNMENTS or skip N`*...
|
||||
|
||||
`if`\
|
||||
*`PATTERN`*\
|
||||
*`PATTERN`*...\
|
||||
*`FIELDASSIGNMENTS or skip`*...
|
||||
*`FIELDASSIGNMENTS or skip N`*...
|
||||
|
||||
This applies one or more field assignments, only to those CSV records matched by one of the PATTERNs.
|
||||
The patterns are case-insensitive regular expressions which match anywhere
|
||||
@ -192,7 +192,7 @@ specific field). When there are multiple patterns they can be written
|
||||
on separate lines, unindented.
|
||||
The field assignments are on separate lines indented by at least one space.
|
||||
|
||||
Instead of field assignments you can specify `skip` to skip the matching record.
|
||||
Instead of field assignments you can specify `skip N` to skip the next N records (including the one that matchied).
|
||||
|
||||
Examples:
|
||||
```rules
|
||||
|
@ -354,7 +354,9 @@ $ ./hledger-csv | hledger balance -f - --no-total
|
||||
<
|
||||
HEADER
|
||||
10/2009/09,Flubber Co,50
|
||||
MIDDLE
|
||||
MIDDLE SKIP THIS LINE
|
||||
AND THIS
|
||||
AND THIS ONE
|
||||
10/2009/09,Flubber Co,50
|
||||
*** END OF FILE ***
|
||||
RULES
|
||||
@ -364,10 +366,12 @@ currency $
|
||||
account1 assets:myacct
|
||||
|
||||
if HEADER
|
||||
MIDDLE
|
||||
END OF FILE
|
||||
skip
|
||||
|
||||
if MIDDLE
|
||||
skip 3
|
||||
|
||||
$ ./hledger-csv
|
||||
2009/09/10 Flubber Co
|
||||
assets:myacct $50
|
||||
|
Loading…
Reference in New Issue
Block a user