;doc: regen manuals

[ci skip]
This commit is contained in:
Simon Michael 2020-01-20 18:02:42 -08:00
parent 69bc8f803b
commit 090f65ec83
20 changed files with 705 additions and 531 deletions

View File

@ -9,9 +9,9 @@
CSV - how hledger reads CSV data, and the CSV rules file format CSV - how hledger reads CSV data, and the CSV rules file format
.SH DESCRIPTION .SH DESCRIPTION
.PP .PP
hledger can read CSV (comma-separated value, or character-separated hledger can read CSV (Comma Separated Value/Character Separated Value)
value) files as if they were journal files, automatically converting files as if they were journal files, automatically converting each CSV
each CSV record into a transaction. record into a transaction.
(To learn about \f[I]writing\f[R] CSV, see CSV output.) (To learn about \f[I]writing\f[R] CSV, see CSV output.)
.PP .PP
We describe each CSV file\[aq]s format with a corresponding \f[I]rules We describe each CSV file\[aq]s format with a corresponding \f[I]rules
@ -83,7 +83,11 @@ inline another CSV rules file
T} T}
.TE .TE
.PP .PP
There\[aq]s also a Convert CSV files tutorial on hledger.org. Note, for best error messages when reading CSV files, use a
\f[C].csv\f[R], \f[C].tsv\f[R] or \f[C].ssv\f[R] file extension or file
prefix - see File Extension below.
.PP
There\[aq]s an introductory Convert CSV files tutorial on hledger.org.
.SH EXAMPLES .SH EXAMPLES
.PP .PP
Here are some sample hledger CSV rules files. Here are some sample hledger CSV rules files.
@ -118,7 +122,7 @@ date-format %d/%m/%Y
.nf .nf
\f[C] \f[C]
$ hledger print -f basic.csv $ hledger print -f basic.csv
2019/11/12 Foo 2019-11-12 Foo
expenses:unknown 10.23 expenses:unknown 10.23
income:unknown -10.23 income:unknown -10.23
\f[R] \f[R]
@ -172,11 +176,11 @@ account1 assets:bank:boi:checking
.nf .nf
\f[C] \f[C]
$ hledger -f bankofireland-checking.csv print $ hledger -f bankofireland-checking.csv print
2012/12/07 LODGMENT 529898 2012-12-07 LODGMENT 529898
assets:bank:boi:checking EUR10.0 = EUR131.2 assets:bank:boi:checking EUR10.0 = EUR131.2
income:unknown EUR-10.0 income:unknown EUR-10.0
2012/12/07 PAYMENT 2012-12-07 PAYMENT
assets:bank:boi:checking EUR-5.0 = EUR126.0 assets:bank:boi:checking EUR-5.0 = EUR126.0
expenses:unknown EUR5.0 expenses:unknown EUR5.0
\f[R] \f[R]
@ -244,11 +248,11 @@ if ,\[rs]$[1-9][.0-9]+(,[\[ha],]*){1}$
.nf .nf
\f[C] \f[C]
$ hledger -f amazon-orders.csv print $ hledger -f amazon-orders.csv print
2012/07/29 (16000000000000DGLNJPI1P9B8DKPVHL) To Foo. ; status:Completed 2012-07-29 (16000000000000DGLNJPI1P9B8DKPVHL) To Foo. ; status:Completed
assets:amazon assets:amazon
expenses:misc $20.00 expenses:misc $20.00
2012/07/30 (17LA58JSKRD4HDGLNJPI1P9B8DKPVHL) To Adapteva, Inc. ; status:Completed 2012-07-30 (17LA58JSKRD4HDGLNJPI1P9B8DKPVHL) To Adapteva, Inc. ; status:Completed
assets:amazon assets:amazon
expenses:misc $25.00 expenses:misc $25.00
expenses:fees $1.00 expenses:fees $1.00
@ -391,32 +395,32 @@ if Google
.nf .nf
\f[C] \f[C]
$ hledger -f paypal-custom.csv print $ hledger -f paypal-custom.csv print
2019/10/01 (60P57143A8206782E) Calm Radio MONTHLY - $1 for the first 2 Months: Me - Order 99309. Item total: $1.00 USD first 2 months, then $6.99 / Month ; itemid:, fromemail:simon\[at]joyful.com, toemail:memberships\[at]calmradio.com, time:03:46:20, type:Subscription Payment, status:Completed 2019-10-01 (60P57143A8206782E) Calm Radio MONTHLY - $1 for the first 2 Months: Me - Order 99309. Item total: $1.00 USD first 2 months, then $6.99 / Month ; itemid:, fromemail:simon\[at]joyful.com, toemail:memberships\[at]calmradio.com, time:03:46:20, type:Subscription Payment, status:Completed
assets:online:paypal $-6.99 = $-6.99 assets:online:paypal $-6.99 = $-6.99
expenses:online:apps $6.99 expenses:online:apps $6.99
2019/10/01 (0TU1544T080463733) Bank Deposit to PP Account for 60P57143A8206782E ; itemid:, fromemail:, toemail:simon\[at]joyful.com, time:03:46:20, type:Bank Deposit to PP Account, status:Pending 2019-10-01 (0TU1544T080463733) Bank Deposit to PP Account for 60P57143A8206782E ; itemid:, fromemail:, toemail:simon\[at]joyful.com, time:03:46:20, type:Bank Deposit to PP Account, status:Pending
assets:online:paypal $6.99 = $0.00 assets:online:paypal $6.99 = $0.00
assets:bank:wf:pchecking $-6.99 assets:bank:wf:pchecking $-6.99
2019/10/01 (2722394R5F586712G) Patreon Patreon* Membership ; itemid:, fromemail:simon\[at]joyful.com, toemail:support\[at]patreon.com, time:08:57:01, type:PreApproved Payment Bill User Payment, status:Completed 2019-10-01 (2722394R5F586712G) Patreon Patreon* Membership ; itemid:, fromemail:simon\[at]joyful.com, toemail:support\[at]patreon.com, time:08:57:01, type:PreApproved Payment Bill User Payment, status:Completed
assets:online:paypal $-7.00 = $-7.00 assets:online:paypal $-7.00 = $-7.00
expenses:dues $7.00 expenses:dues $7.00
2019/10/01 (71854087RG994194F) Bank Deposit to PP Account for 2722394R5F586712G Patreon* Membership ; itemid:, fromemail:, toemail:simon\[at]joyful.com, time:08:57:01, type:Bank Deposit to PP Account, status:Pending 2019-10-01 (71854087RG994194F) Bank Deposit to PP Account for 2722394R5F586712G Patreon* Membership ; itemid:, fromemail:, toemail:simon\[at]joyful.com, time:08:57:01, type:Bank Deposit to PP Account, status:Pending
assets:online:paypal $7.00 = $0.00 assets:online:paypal $7.00 = $0.00
assets:bank:wf:pchecking $-7.00 assets:bank:wf:pchecking $-7.00
2019/10/19 (K9U43044RY432050M) Wikimedia Foundation, Inc. Monthly donation to the Wikimedia Foundation ; itemid:, fromemail:simon\[at]joyful.com, toemail:tle\[at]wikimedia.org, time:03:02:12, type:Subscription Payment, status:Completed 2019-10-19 (K9U43044RY432050M) Wikimedia Foundation, Inc. Monthly donation to the Wikimedia Foundation ; itemid:, fromemail:simon\[at]joyful.com, toemail:tle\[at]wikimedia.org, time:03:02:12, type:Subscription Payment, status:Completed
assets:online:paypal $-2.00 = $-2.00 assets:online:paypal $-2.00 = $-2.00
expenses:dues $2.00 expenses:dues $2.00
expenses:banking:paypal ; business: expenses:banking:paypal ; business:
2019/10/19 (3XJ107139A851061F) Bank Deposit to PP Account for K9U43044RY432050M ; itemid:, fromemail:, toemail:simon\[at]joyful.com, time:03:02:12, type:Bank Deposit to PP Account, status:Pending 2019-10-19 (3XJ107139A851061F) Bank Deposit to PP Account for K9U43044RY432050M ; itemid:, fromemail:, toemail:simon\[at]joyful.com, time:03:02:12, type:Bank Deposit to PP Account, status:Pending
assets:online:paypal $2.00 = $0.00 assets:online:paypal $2.00 = $0.00
assets:bank:wf:pchecking $-2.00 assets:bank:wf:pchecking $-2.00
2019/10/22 (6L8L1662YP1334033) Noble Benefactor Joyful Systems ; itemid:, fromemail:noble\[at]bene.fac.tor, toemail:simon\[at]joyful.com, time:05:07:06, type:Subscription Payment, status:Completed 2019-10-22 (6L8L1662YP1334033) Noble Benefactor Joyful Systems ; itemid:, fromemail:noble\[at]bene.fac.tor, toemail:simon\[at]joyful.com, time:05:07:06, type:Subscription Payment, status:Completed
assets:online:paypal $9.41 = $9.41 assets:online:paypal $9.41 = $9.41
revenues:foss donations:darcshub $-10.00 ; business: revenues:foss donations:darcshub $-10.00 ; business:
expenses:banking:paypal $0.59 ; business: expenses:banking:paypal $0.59 ; business:
@ -575,6 +579,8 @@ Eg to read TSV (Tab Separated Values), use:
separator TAB separator TAB
\f[R] \f[R]
.fi .fi
.PP
See also: File Extension.
.SS \f[C]if\f[R] .SS \f[C]if\f[R]
.IP .IP
.nf .nf
@ -819,6 +825,32 @@ When CSV values are enclosed in quotes, note:
they must be double quotes (not single quotes) they must be double quotes (not single quotes)
.IP \[bu] 2 .IP \[bu] 2
spaces outside the quotes are not allowed spaces outside the quotes are not allowed
.SS File Extension
.PP
CSV (\[dq]Character Separated Values\[dq]) files should be named with
one of these filename extensions: \f[C].csv\f[R], \f[C].ssv\f[R],
\f[C].tsv\f[R].
Or, the file path should be prefixed with one of \f[C]csv:\f[R],
\f[C]ssv:\f[R], \f[C]tsv:\f[R].
This helps hledger identify the format and show the right error
messages.
For example:
.IP
.nf
\f[C]
$ hledger -f foo.ssv print
\f[R]
.fi
.PP
or:
.IP
.nf
\f[C]
$ cat foo | hledger -f ssv:- foo
\f[R]
.fi
.PP
More about this: Input files in the hledger manual.
.SS Reading multiple CSV files .SS Reading multiple CSV files
.PP .PP
If you use multiple \f[C]-f\f[R] options to read multiple CSV files at If you use multiple \f[C]-f\f[R] options to read multiple CSV files at

View File

@ -6,10 +6,10 @@ File: hledger_csv.info, Node: Top, Next: EXAMPLES, Up: (dir)
hledger_csv(5) hledger 1.16.99 hledger_csv(5) hledger 1.16.99
****************************** ******************************
hledger can read CSV (comma-separated value, or character-separated hledger can read CSV (Comma Separated Value/Character Separated Value)
value) files as if they were journal files, automatically converting files as if they were journal files, automatically converting each CSV
each CSV record into a transaction. (To learn about _writing_ CSV, see record into a transaction. (To learn about _writing_ CSV, see CSV
CSV output.) output.)
We describe each CSV file's format with a corresponding _rules file_. We describe each CSV file's format with a corresponding _rules file_.
By default this is named like the CSV file with a '.rules' extension By default this is named like the CSV file with a '.rules' extension
@ -37,7 +37,11 @@ assignment*
*'newest-first'* disambiguate record order when there's only one date *'newest-first'* disambiguate record order when there's only one date
*'include'* inline another CSV rules file *'include'* inline another CSV rules file
There's also a Convert CSV files tutorial on hledger.org. Note, for best error messages when reading CSV files, use a '.csv',
'.tsv' or '.ssv' file extension or file prefix - see File Extension
below.
There's an introductory Convert CSV files tutorial on hledger.org.
* Menu: * Menu:
@ -81,7 +85,7 @@ fields date, description, _, amount
date-format %d/%m/%Y date-format %d/%m/%Y
$ hledger print -f basic.csv $ hledger print -f basic.csv
2019/11/12 Foo 2019-11-12 Foo
expenses:unknown 10.23 expenses:unknown 10.23
income:unknown -10.23 income:unknown -10.23
@ -128,11 +132,11 @@ currency EUR
account1 assets:bank:boi:checking account1 assets:bank:boi:checking
$ hledger -f bankofireland-checking.csv print $ hledger -f bankofireland-checking.csv print
2012/12/07 LODGMENT 529898 2012-12-07 LODGMENT 529898
assets:bank:boi:checking EUR10.0 = EUR131.2 assets:bank:boi:checking EUR10.0 = EUR131.2
income:unknown EUR-10.0 income:unknown EUR-10.0
2012/12/07 PAYMENT 2012-12-07 PAYMENT
assets:bank:boi:checking EUR-5.0 = EUR126.0 assets:bank:boi:checking EUR-5.0 = EUR126.0
expenses:unknown EUR5.0 expenses:unknown EUR5.0
@ -192,11 +196,11 @@ if ,\$[1-9][.0-9]+(,[^,]*){1}$
amount3 %fees amount3 %fees
$ hledger -f amazon-orders.csv print $ hledger -f amazon-orders.csv print
2012/07/29 (16000000000000DGLNJPI1P9B8DKPVHL) To Foo. ; status:Completed 2012-07-29 (16000000000000DGLNJPI1P9B8DKPVHL) To Foo. ; status:Completed
assets:amazon assets:amazon
expenses:misc $20.00 expenses:misc $20.00
2012/07/30 (17LA58JSKRD4HDGLNJPI1P9B8DKPVHL) To Adapteva, Inc. ; status:Completed 2012-07-30 (17LA58JSKRD4HDGLNJPI1P9B8DKPVHL) To Adapteva, Inc. ; status:Completed
assets:amazon assets:amazon
expenses:misc $25.00 expenses:misc $25.00
expenses:fees $1.00 expenses:fees $1.00
@ -328,32 +332,32 @@ if Google
description google | music description google | music
$ hledger -f paypal-custom.csv print $ hledger -f paypal-custom.csv print
2019/10/01 (60P57143A8206782E) Calm Radio MONTHLY - $1 for the first 2 Months: Me - Order 99309. Item total: $1.00 USD first 2 months, then $6.99 / Month ; itemid:, fromemail:simon@joyful.com, toemail:memberships@calmradio.com, time:03:46:20, type:Subscription Payment, status:Completed 2019-10-01 (60P57143A8206782E) Calm Radio MONTHLY - $1 for the first 2 Months: Me - Order 99309. Item total: $1.00 USD first 2 months, then $6.99 / Month ; itemid:, fromemail:simon@joyful.com, toemail:memberships@calmradio.com, time:03:46:20, type:Subscription Payment, status:Completed
assets:online:paypal $-6.99 = $-6.99 assets:online:paypal $-6.99 = $-6.99
expenses:online:apps $6.99 expenses:online:apps $6.99
2019/10/01 (0TU1544T080463733) Bank Deposit to PP Account for 60P57143A8206782E ; itemid:, fromemail:, toemail:simon@joyful.com, time:03:46:20, type:Bank Deposit to PP Account, status:Pending 2019-10-01 (0TU1544T080463733) Bank Deposit to PP Account for 60P57143A8206782E ; itemid:, fromemail:, toemail:simon@joyful.com, time:03:46:20, type:Bank Deposit to PP Account, status:Pending
assets:online:paypal $6.99 = $0.00 assets:online:paypal $6.99 = $0.00
assets:bank:wf:pchecking $-6.99 assets:bank:wf:pchecking $-6.99
2019/10/01 (2722394R5F586712G) Patreon Patreon* Membership ; itemid:, fromemail:simon@joyful.com, toemail:support@patreon.com, time:08:57:01, type:PreApproved Payment Bill User Payment, status:Completed 2019-10-01 (2722394R5F586712G) Patreon Patreon* Membership ; itemid:, fromemail:simon@joyful.com, toemail:support@patreon.com, time:08:57:01, type:PreApproved Payment Bill User Payment, status:Completed
assets:online:paypal $-7.00 = $-7.00 assets:online:paypal $-7.00 = $-7.00
expenses:dues $7.00 expenses:dues $7.00
2019/10/01 (71854087RG994194F) Bank Deposit to PP Account for 2722394R5F586712G Patreon* Membership ; itemid:, fromemail:, toemail:simon@joyful.com, time:08:57:01, type:Bank Deposit to PP Account, status:Pending 2019-10-01 (71854087RG994194F) Bank Deposit to PP Account for 2722394R5F586712G Patreon* Membership ; itemid:, fromemail:, toemail:simon@joyful.com, time:08:57:01, type:Bank Deposit to PP Account, status:Pending
assets:online:paypal $7.00 = $0.00 assets:online:paypal $7.00 = $0.00
assets:bank:wf:pchecking $-7.00 assets:bank:wf:pchecking $-7.00
2019/10/19 (K9U43044RY432050M) Wikimedia Foundation, Inc. Monthly donation to the Wikimedia Foundation ; itemid:, fromemail:simon@joyful.com, toemail:tle@wikimedia.org, time:03:02:12, type:Subscription Payment, status:Completed 2019-10-19 (K9U43044RY432050M) Wikimedia Foundation, Inc. Monthly donation to the Wikimedia Foundation ; itemid:, fromemail:simon@joyful.com, toemail:tle@wikimedia.org, time:03:02:12, type:Subscription Payment, status:Completed
assets:online:paypal $-2.00 = $-2.00 assets:online:paypal $-2.00 = $-2.00
expenses:dues $2.00 expenses:dues $2.00
expenses:banking:paypal ; business: expenses:banking:paypal ; business:
2019/10/19 (3XJ107139A851061F) Bank Deposit to PP Account for K9U43044RY432050M ; itemid:, fromemail:, toemail:simon@joyful.com, time:03:02:12, type:Bank Deposit to PP Account, status:Pending 2019-10-19 (3XJ107139A851061F) Bank Deposit to PP Account for K9U43044RY432050M ; itemid:, fromemail:, toemail:simon@joyful.com, time:03:02:12, type:Bank Deposit to PP Account, status:Pending
assets:online:paypal $2.00 = $0.00 assets:online:paypal $2.00 = $0.00
assets:bank:wf:pchecking $-2.00 assets:bank:wf:pchecking $-2.00
2019/10/22 (6L8L1662YP1334033) Noble Benefactor Joyful Systems ; itemid:, fromemail:noble@bene.fac.tor, toemail:simon@joyful.com, time:05:07:06, type:Subscription Payment, status:Completed 2019-10-22 (6L8L1662YP1334033) Noble Benefactor Joyful Systems ; itemid:, fromemail:noble@bene.fac.tor, toemail:simon@joyful.com, time:05:07:06, type:Subscription Payment, status:Completed
assets:online:paypal $9.41 = $9.41 assets:online:paypal $9.41 = $9.41
revenues:foss donations:darcshub $-10.00 ; business: revenues:foss donations:darcshub $-10.00 ; business:
expenses:banking:paypal $0.59 ; business: expenses:banking:paypal $0.59 ; business:
@ -523,6 +527,8 @@ words 'TAB' or 'SPACE'. Eg to read TSV (Tab Separated Values), use:
separator TAB separator TAB
See also: File Extension.
 
File: hledger_csv.info, Node: if, Next: end, Prev: separator, Up: CSV RULES File: hledger_csv.info, Node: if, Next: end, Prev: separator, Up: CSV RULES
@ -705,6 +711,7 @@ File: hledger_csv.info, Node: TIPS, Prev: CSV RULES, Up: Top
* Rapid feedback:: * Rapid feedback::
* Valid CSV:: * Valid CSV::
* File Extension::
* Reading multiple CSV files:: * Reading multiple CSV files::
* Valid transactions:: * Valid transactions::
* Deduplicating importing:: * Deduplicating importing::
@ -731,7 +738,7 @@ a separator each time the command re-runs, making it easier to read the
output. output.
 
File: hledger_csv.info, Node: Valid CSV, Next: Reading multiple CSV files, Prev: Rapid feedback, Up: TIPS File: hledger_csv.info, Node: Valid CSV, Next: File Extension, Prev: Rapid feedback, Up: TIPS
3.2 Valid CSV 3.2 Valid CSV
============= =============
@ -743,9 +750,29 @@ enclosed in quotes, note:
* spaces outside the quotes are not allowed * spaces outside the quotes are not allowed
 
File: hledger_csv.info, Node: Reading multiple CSV files, Next: Valid transactions, Prev: Valid CSV, Up: TIPS File: hledger_csv.info, Node: File Extension, Next: Reading multiple CSV files, Prev: Valid CSV, Up: TIPS
3.3 Reading multiple CSV files 3.3 File Extension
==================
CSV ("Character Separated Values") files should be named with one of
these filename extensions: '.csv', '.ssv', '.tsv'. Or, the file path
should be prefixed with one of 'csv:', 'ssv:', 'tsv:'. This helps
hledger identify the format and show the right error messages. For
example:
$ hledger -f foo.ssv print
or:
$ cat foo | hledger -f ssv:- foo
More about this: Input files in the hledger manual.

File: hledger_csv.info, Node: Reading multiple CSV files, Next: Valid transactions, Prev: File Extension, Up: TIPS
3.4 Reading multiple CSV files
============================== ==============================
If you use multiple '-f' options to read multiple CSV files at once, If you use multiple '-f' options to read multiple CSV files at once,
@ -756,7 +783,7 @@ used for all the CSV files.
 
File: hledger_csv.info, Node: Valid transactions, Next: Deduplicating importing, Prev: Reading multiple CSV files, Up: TIPS File: hledger_csv.info, Node: Valid transactions, Next: Deduplicating importing, Prev: Reading multiple CSV files, Up: TIPS
3.4 Valid transactions 3.5 Valid transactions
====================== ======================
After reading a CSV file, hledger post-processes and validates the After reading a CSV file, hledger post-processes and validates the
@ -775,7 +802,7 @@ $ hledger -f file.csv print | hledger -f- print
 
File: hledger_csv.info, Node: Deduplicating importing, Next: Setting amounts, Prev: Valid transactions, Up: TIPS File: hledger_csv.info, Node: Deduplicating importing, Next: Setting amounts, Prev: Valid transactions, Up: TIPS
3.5 Deduplicating, importing 3.6 Deduplicating, importing
============================ ============================
When you download a CSV file periodically, eg to get your latest bank When you download a CSV file periodically, eg to get your latest bank
@ -805,7 +832,7 @@ CSV data. See:
 
File: hledger_csv.info, Node: Setting amounts, Next: Setting currency/commodity, Prev: Deduplicating importing, Up: TIPS File: hledger_csv.info, Node: Setting amounts, Next: Setting currency/commodity, Prev: Deduplicating importing, Up: TIPS
3.6 Setting amounts 3.7 Setting amounts
=================== ===================
A posting amount can be set in one of these ways: A posting amount can be set in one of these ways:
@ -834,7 +861,7 @@ A posting amount can be set in one of these ways:
 
File: hledger_csv.info, Node: Setting currency/commodity, Next: Referencing other fields, Prev: Setting amounts, Up: TIPS File: hledger_csv.info, Node: Setting currency/commodity, Next: Referencing other fields, Prev: Setting amounts, Up: TIPS
3.7 Setting currency/commodity 3.8 Setting currency/commodity
============================== ==============================
If the currency/commodity symbol is included in the CSV's amount If the currency/commodity symbol is included in the CSV's amount
@ -861,7 +888,7 @@ field(s), you don't have to do anything special.
 
File: hledger_csv.info, Node: Referencing other fields, Next: How CSV rules are evaluated, Prev: Setting currency/commodity, Up: TIPS File: hledger_csv.info, Node: Referencing other fields, Next: How CSV rules are evaluated, Prev: Setting currency/commodity, Up: TIPS
3.8 Referencing other fields 3.9 Referencing other fields
============================ ============================
In field assignments, you can interpolate only CSV fields, not hledger In field assignments, you can interpolate only CSV fields, not hledger
@ -898,8 +925,8 @@ if something
 
File: hledger_csv.info, Node: How CSV rules are evaluated, Prev: Referencing other fields, Up: TIPS File: hledger_csv.info, Node: How CSV rules are evaluated, Prev: Referencing other fields, Up: TIPS
3.9 How CSV rules are evaluated 3.10 How CSV rules are evaluated
=============================== ================================
Here's how to think of CSV rules being evaluated (if you really need Here's how to think of CSV rules being evaluated (if you really need
to). First, to). First,
@ -939,62 +966,64 @@ command the user specified.
 
Tag Table: Tag Table:
Node: Top72 Node: Top72
Node: EXAMPLES1879 Node: EXAMPLES2031
Ref: #examples1985 Ref: #examples2137
Node: Basic2193 Node: Basic2345
Ref: #basic2293 Ref: #basic2445
Node: Bank of Ireland2835 Node: Bank of Ireland2987
Ref: #bank-of-ireland2970 Ref: #bank-of-ireland3122
Node: Amazon4433 Node: Amazon4585
Ref: #amazon4551 Ref: #amazon4703
Node: Paypal6484 Node: Paypal6636
Ref: #paypal6578 Ref: #paypal6730
Node: CSV RULES14461 Node: CSV RULES14613
Ref: #csv-rules14570 Ref: #csv-rules14722
Node: skip14846 Node: skip14998
Ref: #skip14939 Ref: #skip15091
Node: fields15314 Node: fields15466
Ref: #fields15436 Ref: #fields15588
Node: Transaction field names16601 Node: Transaction field names16753
Ref: #transaction-field-names16761 Ref: #transaction-field-names16913
Node: Posting field names16872 Node: Posting field names17024
Ref: #posting-field-names17024 Ref: #posting-field-names17176
Node: field assignment18315 Node: field assignment18467
Ref: #field-assignment18458 Ref: #field-assignment18610
Node: separator19276 Node: separator19428
Ref: #separator19405 Ref: #separator19557
Node: if19786 Node: if19968
Ref: #if19888 Ref: #if20070
Node: end21604 Node: end21786
Ref: #end21710 Ref: #end21892
Node: date-format21934 Node: date-format22116
Ref: #date-format22066 Ref: #date-format22248
Node: newest-first22815 Node: newest-first22997
Ref: #newest-first22953 Ref: #newest-first23135
Node: include23636 Node: include23818
Ref: #include23765 Ref: #include23947
Node: balance-type24209 Node: balance-type24391
Ref: #balance-type24329 Ref: #balance-type24511
Node: TIPS25029 Node: TIPS25211
Ref: #tips25111 Ref: #tips25293
Node: Rapid feedback25348 Node: Rapid feedback25549
Ref: #rapid-feedback25465 Ref: #rapid-feedback25666
Node: Valid CSV25925 Node: Valid CSV26126
Ref: #valid-csv26067 Ref: #valid-csv26256
Node: Reading multiple CSV files26259 Node: File Extension26448
Ref: #reading-multiple-csv-files26439 Ref: #file-extension26600
Node: Valid transactions26680 Node: Reading multiple CSV files27010
Ref: #valid-transactions26858 Ref: #reading-multiple-csv-files27195
Node: Deduplicating importing27486 Node: Valid transactions27436
Ref: #deduplicating-importing27665 Ref: #valid-transactions27614
Node: Setting amounts28698 Node: Deduplicating importing28242
Ref: #setting-amounts28867 Ref: #deduplicating-importing28421
Node: Setting currency/commodity29853 Node: Setting amounts29454
Ref: #setting-currencycommodity30045 Ref: #setting-amounts29623
Node: Referencing other fields30848 Node: Setting currency/commodity30609
Ref: #referencing-other-fields31048 Ref: #setting-currencycommodity30801
Node: How CSV rules are evaluated31945 Node: Referencing other fields31604
Ref: #how-csv-rules-are-evaluated32116 Ref: #referencing-other-fields31804
Node: How CSV rules are evaluated32701
Ref: #how-csv-rules-are-evaluated32874
 
End Tag Table End Tag Table

View File

@ -7,10 +7,10 @@ NAME
CSV - how hledger reads CSV data, and the CSV rules file format CSV - how hledger reads CSV data, and the CSV rules file format
DESCRIPTION DESCRIPTION
hledger can read CSV (comma-separated value, or character-separated hledger can read CSV (Comma Separated Value/Character Separated Value)
value) files as if they were journal files, automatically converting files as if they were journal files, automatically converting each CSV
each CSV record into a transaction. (To learn about writing CSV, see record into a transaction. (To learn about writing CSV, see CSV out-
CSV output.) put.)
We describe each CSV file's format with a corresponding rules file. By We describe each CSV file's format with a corresponding rules file. By
default this is named like the CSV file with a .rules extension added. default this is named like the CSV file with a .rules extension added.
@ -46,16 +46,19 @@ DESCRIPTION
include inline another CSV rules include inline another CSV rules
file file
There's also a Convert CSV files tutorial on hledger.org. Note, for best error messages when reading CSV files, use a .csv, .tsv
or .ssv file extension or file prefix - see File Extension below.
There's an introductory Convert CSV files tutorial on hledger.org.
EXAMPLES EXAMPLES
Here are some sample hledger CSV rules files. See also the full col- Here are some sample hledger CSV rules files. See also the full col-
lection at: lection at:
https://github.com/simonmichael/hledger/tree/master/examples/csv https://github.com/simonmichael/hledger/tree/master/examples/csv
Basic Basic
At minimum, the rules file must identify the date and amount fields, At minimum, the rules file must identify the date and amount fields,
and often it also specifies the date format and how many header lines and often it also specifies the date format and how many header lines
there are. Here's a simple CSV file and a rules file for it: there are. Here's a simple CSV file and a rules file for it:
Date, Description, Id, Amount Date, Description, Id, Amount
@ -67,15 +70,15 @@ EXAMPLES
date-format %d/%m/%Y date-format %d/%m/%Y
$ hledger print -f basic.csv $ hledger print -f basic.csv
2019/11/12 Foo 2019-11-12 Foo
expenses:unknown 10.23 expenses:unknown 10.23
income:unknown -10.23 income:unknown -10.23
Default account names are chosen, since we didn't set them. Default account names are chosen, since we didn't set them.
Bank of Ireland Bank of Ireland
Here's a CSV with two amount fields (Debit and Credit), and a balance Here's a CSV with two amount fields (Debit and Credit), and a balance
field, which we can use to add balance assertions, which is not neces- field, which we can use to add balance assertions, which is not neces-
sary but provides extra error checking: sary but provides extra error checking:
Date,Details,Debit,Credit,Balance Date,Details,Debit,Credit,Balance
@ -109,21 +112,21 @@ EXAMPLES
account1 assets:bank:boi:checking account1 assets:bank:boi:checking
$ hledger -f bankofireland-checking.csv print $ hledger -f bankofireland-checking.csv print
2012/12/07 LODGMENT 529898 2012-12-07 LODGMENT 529898
assets:bank:boi:checking EUR10.0 = EUR131.2 assets:bank:boi:checking EUR10.0 = EUR131.2
income:unknown EUR-10.0 income:unknown EUR-10.0
2012/12/07 PAYMENT 2012-12-07 PAYMENT
assets:bank:boi:checking EUR-5.0 = EUR126.0 assets:bank:boi:checking EUR-5.0 = EUR126.0
expenses:unknown EUR5.0 expenses:unknown EUR5.0
The balance assertions don't raise an error above, because we're read- The balance assertions don't raise an error above, because we're read-
ing directly from CSV, but they will be checked if these entries are ing directly from CSV, but they will be checked if these entries are
imported into a journal file. imported into a journal file.
Amazon Amazon
Here we convert amazon.com order history, and use an if block to gener- Here we convert amazon.com order history, and use an if block to gener-
ate a third posting if there's a fee. (In practice you'd probably get ate a third posting if there's a fee. (In practice you'd probably get
this data from your bank instead, but it's an example.) this data from your bank instead, but it's an example.)
"Date","Type","To/From","Name","Status","Amount","Fees","Transaction ID" "Date","Type","To/From","Name","Status","Amount","Fees","Transaction ID"
@ -168,17 +171,17 @@ EXAMPLES
amount3 %fees amount3 %fees
$ hledger -f amazon-orders.csv print $ hledger -f amazon-orders.csv print
2012/07/29 (16000000000000DGLNJPI1P9B8DKPVHL) To Foo. ; status:Completed 2012-07-29 (16000000000000DGLNJPI1P9B8DKPVHL) To Foo. ; status:Completed
assets:amazon assets:amazon
expenses:misc $20.00 expenses:misc $20.00
2012/07/30 (17LA58JSKRD4HDGLNJPI1P9B8DKPVHL) To Adapteva, Inc. ; status:Completed 2012-07-30 (17LA58JSKRD4HDGLNJPI1P9B8DKPVHL) To Adapteva, Inc. ; status:Completed
assets:amazon assets:amazon
expenses:misc $25.00 expenses:misc $25.00
expenses:fees $1.00 expenses:fees $1.00
Paypal Paypal
Here's a real-world rules file for (customised) Paypal CSV, with some Here's a real-world rules file for (customised) Paypal CSV, with some
Paypal-specific rules, and a second rules file included: Paypal-specific rules, and a second rules file included:
"Date","Time","TimeZone","Name","Type","Status","Currency","Gross","Fee","Net","From Email Address","To Email Address","Transaction ID","Item Title","Item ID","Reference Txn ID","Receipt ID","Balance","Note" "Date","Time","TimeZone","Name","Type","Status","Currency","Gross","Fee","Net","From Email Address","To Email Address","Transaction ID","Item Title","Item ID","Reference Txn ID","Receipt ID","Balance","Note"
@ -299,32 +302,32 @@ EXAMPLES
description google | music description google | music
$ hledger -f paypal-custom.csv print $ hledger -f paypal-custom.csv print
2019/10/01 (60P57143A8206782E) Calm Radio MONTHLY - $1 for the first 2 Months: Me - Order 99309. Item total: $1.00 USD first 2 months, then $6.99 / Month ; itemid:, fromemail:simon@joyful.com, toemail:memberships@calmradio.com, time:03:46:20, type:Subscription Payment, status:Completed 2019-10-01 (60P57143A8206782E) Calm Radio MONTHLY - $1 for the first 2 Months: Me - Order 99309. Item total: $1.00 USD first 2 months, then $6.99 / Month ; itemid:, fromemail:simon@joyful.com, toemail:memberships@calmradio.com, time:03:46:20, type:Subscription Payment, status:Completed
assets:online:paypal $-6.99 = $-6.99 assets:online:paypal $-6.99 = $-6.99
expenses:online:apps $6.99 expenses:online:apps $6.99
2019/10/01 (0TU1544T080463733) Bank Deposit to PP Account for 60P57143A8206782E ; itemid:, fromemail:, toemail:simon@joyful.com, time:03:46:20, type:Bank Deposit to PP Account, status:Pending 2019-10-01 (0TU1544T080463733) Bank Deposit to PP Account for 60P57143A8206782E ; itemid:, fromemail:, toemail:simon@joyful.com, time:03:46:20, type:Bank Deposit to PP Account, status:Pending
assets:online:paypal $6.99 = $0.00 assets:online:paypal $6.99 = $0.00
assets:bank:wf:pchecking $-6.99 assets:bank:wf:pchecking $-6.99
2019/10/01 (2722394R5F586712G) Patreon Patreon* Membership ; itemid:, fromemail:simon@joyful.com, toemail:support@patreon.com, time:08:57:01, type:PreApproved Payment Bill User Payment, status:Completed 2019-10-01 (2722394R5F586712G) Patreon Patreon* Membership ; itemid:, fromemail:simon@joyful.com, toemail:support@patreon.com, time:08:57:01, type:PreApproved Payment Bill User Payment, status:Completed
assets:online:paypal $-7.00 = $-7.00 assets:online:paypal $-7.00 = $-7.00
expenses:dues $7.00 expenses:dues $7.00
2019/10/01 (71854087RG994194F) Bank Deposit to PP Account for 2722394R5F586712G Patreon* Membership ; itemid:, fromemail:, toemail:simon@joyful.com, time:08:57:01, type:Bank Deposit to PP Account, status:Pending 2019-10-01 (71854087RG994194F) Bank Deposit to PP Account for 2722394R5F586712G Patreon* Membership ; itemid:, fromemail:, toemail:simon@joyful.com, time:08:57:01, type:Bank Deposit to PP Account, status:Pending
assets:online:paypal $7.00 = $0.00 assets:online:paypal $7.00 = $0.00
assets:bank:wf:pchecking $-7.00 assets:bank:wf:pchecking $-7.00
2019/10/19 (K9U43044RY432050M) Wikimedia Foundation, Inc. Monthly donation to the Wikimedia Foundation ; itemid:, fromemail:simon@joyful.com, toemail:tle@wikimedia.org, time:03:02:12, type:Subscription Payment, status:Completed 2019-10-19 (K9U43044RY432050M) Wikimedia Foundation, Inc. Monthly donation to the Wikimedia Foundation ; itemid:, fromemail:simon@joyful.com, toemail:tle@wikimedia.org, time:03:02:12, type:Subscription Payment, status:Completed
assets:online:paypal $-2.00 = $-2.00 assets:online:paypal $-2.00 = $-2.00
expenses:dues $2.00 expenses:dues $2.00
expenses:banking:paypal ; business: expenses:banking:paypal ; business:
2019/10/19 (3XJ107139A851061F) Bank Deposit to PP Account for K9U43044RY432050M ; itemid:, fromemail:, toemail:simon@joyful.com, time:03:02:12, type:Bank Deposit to PP Account, status:Pending 2019-10-19 (3XJ107139A851061F) Bank Deposit to PP Account for K9U43044RY432050M ; itemid:, fromemail:, toemail:simon@joyful.com, time:03:02:12, type:Bank Deposit to PP Account, status:Pending
assets:online:paypal $2.00 = $0.00 assets:online:paypal $2.00 = $0.00
assets:bank:wf:pchecking $-2.00 assets:bank:wf:pchecking $-2.00
2019/10/22 (6L8L1662YP1334033) Noble Benefactor Joyful Systems ; itemid:, fromemail:noble@bene.fac.tor, toemail:simon@joyful.com, time:05:07:06, type:Subscription Payment, status:Completed 2019-10-22 (6L8L1662YP1334033) Noble Benefactor Joyful Systems ; itemid:, fromemail:noble@bene.fac.tor, toemail:simon@joyful.com, time:05:07:06, type:Subscription Payment, status:Completed
assets:online:paypal $9.41 = $9.41 assets:online:paypal $9.41 = $9.41
revenues:foss donations:darcshub $-10.00 ; business: revenues:foss donations:darcshub $-10.00 ; business:
expenses:banking:paypal $0.59 ; business: expenses:banking:paypal $0.59 ; business:
@ -336,9 +339,9 @@ CSV RULES
skip skip
skip N skip N
The word "skip" followed by a number (or no number, meaning 1) tells The word "skip" followed by a number (or no number, meaning 1) tells
hledger to ignore this many non-empty lines preceding the CSV data. hledger to ignore this many non-empty lines preceding the CSV data.
(Empty/blank lines are skipped automatically.) You'll need this when- (Empty/blank lines are skipped automatically.) You'll need this when-
ever your CSV data contains header lines. ever your CSV data contains header lines.
It also has a second purpose: it can be used inside if blocks to ignore It also has a second purpose: it can be used inside if blocks to ignore
@ -347,27 +350,27 @@ CSV RULES
fields fields
fields FIELDNAME1, FIELDNAME2, ... fields FIELDNAME1, FIELDNAME2, ...
A fields list (the word "fields" followed by comma-separated field A fields list (the word "fields" followed by comma-separated field
names) is the quick way to assign CSV field values to hledger fields. names) is the quick way to assign CSV field values to hledger fields.
It does two things: It does two things:
1. it names the CSV fields. This is optional, but can be convenient 1. it names the CSV fields. This is optional, but can be convenient
later for interpolating them. later for interpolating them.
2. when you use a standard hledger field name, it assigns the CSV value 2. when you use a standard hledger field name, it assigns the CSV value
to that part of the hledger transaction. to that part of the hledger transaction.
Here's an example that says "use the 1st, 2nd and 4th fields as the Here's an example that says "use the 1st, 2nd and 4th fields as the
transaction's date, description and amount; name the last two fields transaction's date, description and amount; name the last two fields
for later reference; and ignore the others": for later reference; and ignore the others":
fields date, description, , amount, , , somefield, anotherfield fields date, description, , amount, , , somefield, anotherfield
Field names may not contain whitespace. Fields you don't care about Field names may not contain whitespace. Fields you don't care about
can be left unnamed. Currently there must be least two items (there can be left unnamed. Currently there must be least two items (there
must be at least one comma). must be at least one comma).
Note, always use comma in the fields list, even if your CSV uses an- Note, always use comma in the fields list, even if your CSV uses an-
other separator character. other separator character.
Here are the standard hledger field/pseudo-field names. For more about Here are the standard hledger field/pseudo-field names. For more about
@ -379,28 +382,28 @@ CSV RULES
transaction's first line. transaction's first line.
Posting field names Posting field names
accountN, where N is 1 to 9, generates a posting, with that account accountN, where N is 1 to 9, generates a posting, with that account
name. Most often there are two postings, so you'll want to set ac- name. Most often there are two postings, so you'll want to set ac-
count1 and account2. If a posting's account name is left unset but its count1 and account2. If a posting's account name is left unset but its
amount is set, a default account name will be chosen (like expenses:un- amount is set, a default account name will be chosen (like expenses:un-
known or income:unknown). known or income:unknown).
amountN sets posting N's amount. Or, amount with no N sets posting amountN sets posting N's amount. Or, amount with no N sets posting
1's. If the CSV has debits and credits in separate fields, use 1's. If the CSV has debits and credits in separate fields, use
amountN-in and amountN-out instead. Or amount-in and amount-out with amountN-in and amountN-out instead. Or amount-in and amount-out with
no N for posting 1. no N for posting 1.
For convenience and backwards compatibility, if you set the amount of For convenience and backwards compatibility, if you set the amount of
posting 1 only, a second posting with the negative amount will be gen- posting 1 only, a second posting with the negative amount will be gen-
erated automatically. (Unless the account name is parenthesised indi- erated automatically. (Unless the account name is parenthesised indi-
cating an unbalanced posting.) cating an unbalanced posting.)
If the CSV has the currency symbol in a separate field, you can use If the CSV has the currency symbol in a separate field, you can use
currencyN to prepend it to posting N's amount. currency with no N af- currencyN to prepend it to posting N's amount. currency with no N af-
fects ALL postings. fects ALL postings.
balanceN sets a balance assertion amount (or if the posting amount is balanceN sets a balance assertion amount (or if the posting amount is
left empty, a balance assignment). You may need to adjust this with left empty, a balance assignment). You may need to adjust this with
the balance-type rule. the balance-type rule.
Finally, commentN sets a comment on the Nth posting. Comments can also Finally, commentN sets a comment on the Nth posting. Comments can also
@ -411,11 +414,11 @@ CSV RULES
field assignment field assignment
HLEDGERFIELDNAME FIELDVALUE HLEDGERFIELDNAME FIELDVALUE
Instead of or in addition to a fields list, you can use a "field as- Instead of or in addition to a fields list, you can use a "field as-
signment" rule to set the value of a single hledger field, by writing signment" rule to set the value of a single hledger field, by writing
its name (any of the standard hledger field names above) followed by a its name (any of the standard hledger field names above) followed by a
text value. The value may contain interpolated CSV fields, referenced text value. The value may contain interpolated CSV fields, referenced
by their 1-based position in the CSV record (%N), or by the name they by their 1-based position in the CSV record (%N), or by the name they
were given in the fields list (%CSVFIELDNAME). Some examples: were given in the fields list (%CSVFIELDNAME). Some examples:
# set the amount to the 4th CSV field, with " USD" appended # set the amount to the 4th CSV field, with " USD" appended
@ -424,22 +427,24 @@ CSV RULES
# combine three fields to make a comment, containing note: and date: tags # combine three fields to make a comment, containing note: and date: tags
comment note: %somefield - %anotherfield, date: %1 comment note: %somefield - %anotherfield, date: %1
Interpolation strips outer whitespace (so a CSV value like " 1 " be- Interpolation strips outer whitespace (so a CSV value like " 1 " be-
comes 1 when interpolated) (#1051). See TIPS below for more about ref- comes 1 when interpolated) (#1051). See TIPS below for more about ref-
erencing other fields. erencing other fields.
separator separator
You can use the separator directive to read other kinds of character- You can use the separator directive to read other kinds of character-
separated data. Eg to read SSV (Semicolon Separated Values), use: separated data. Eg to read SSV (Semicolon Separated Values), use:
separator ; separator ;
The separator directive accepts exactly one single byte character as a The separator directive accepts exactly one single byte character as a
separator. To specify whitespace characters, you may use the special separator. To specify whitespace characters, you may use the special
words TAB or SPACE. Eg to read TSV (Tab Separated Values), use: words TAB or SPACE. Eg to read TSV (Tab Separated Values), use:
separator TAB separator TAB
See also: File Extension.
if if
if PATTERN if PATTERN
RULE RULE
@ -451,28 +456,28 @@ CSV RULES
RULE RULE
RULE RULE
Conditional blocks ("if blocks") are a block of rules that are applied Conditional blocks ("if blocks") are a block of rules that are applied
only to CSV records which match certain patterns. They are often used only to CSV records which match certain patterns. They are often used
for customising account names based on transaction descriptions. for customising account names based on transaction descriptions.
A single pattern can be written on the same line as the "if"; or multi- A single pattern can be written on the same line as the "if"; or multi-
ple patterns can be written on the following lines, non-indented. Mul- ple patterns can be written on the following lines, non-indented. Mul-
tiple patterns are OR'd (any one of them can match). Patterns are tiple patterns are OR'd (any one of them can match). Patterns are
case-insensitive regular expressions which try to match anywhere within case-insensitive regular expressions which try to match anywhere within
the whole CSV record (POSIX extended regular expressions with some ad- the whole CSV record (POSIX extended regular expressions with some ad-
ditions, see https://hledger.org/hledger.html#regular-expressions). ditions, see https://hledger.org/hledger.html#regular-expressions).
Note the CSV record they see is close to, but not identical to, the one Note the CSV record they see is close to, but not identical to, the one
in the CSV file; enclosing double quotes will be removed, and the sepa- in the CSV file; enclosing double quotes will be removed, and the sepa-
rator character is always comma. rator character is always comma.
It's not yet easy to match within a specific field. If the data does It's not yet easy to match within a specific field. If the data does
not contain commas, you can hack it with a regular expression like: not contain commas, you can hack it with a regular expression like:
# match "foo" in the fourth field # match "foo" in the fourth field
if ^([^,]*,){3}foo if ^([^,]*,){3}foo
After the patterns there should be one or more rules to apply, all in- After the patterns there should be one or more rules to apply, all in-
dented by at least one space. Three kinds of rule are allowed in con- dented by at least one space. Three kinds of rule are allowed in con-
ditional blocks: ditional blocks:
o field assignments (to set a hledger field) o field assignments (to set a hledger field)
@ -496,7 +501,7 @@ CSV RULES
comment XXX deductible ? check it comment XXX deductible ? check it
end end
This rule can be used inside if blocks (only), to make hledger stop This rule can be used inside if blocks (only), to make hledger stop
reading this CSV file and move on to the next input file, or to command reading this CSV file and move on to the next input file, or to command
execution. Eg: execution. Eg:
@ -507,10 +512,10 @@ CSV RULES
date-format date-format
date-format DATEFMT date-format DATEFMT
This is a helper for the date (and date2) fields. If your CSV dates This is a helper for the date (and date2) fields. If your CSV dates
are not formatted like YYYY-MM-DD, YYYY/MM/DD or YYYY.MM.DD, you'll are not formatted like YYYY-MM-DD, YYYY/MM/DD or YYYY.MM.DD, you'll
need to add a date-format rule describing them with a strptime date need to add a date-format rule describing them with a strptime date
parsing pattern, which must parse the CSV date value completely. Some parsing pattern, which must parse the CSV date value completely. Some
examples: examples:
# MM/DD/YY # MM/DD/YY
@ -532,15 +537,15 @@ CSV RULES
mat.html#v:formatTime mat.html#v:formatTime
newest-first newest-first
hledger always sorts the generated transactions by date. Transactions hledger always sorts the generated transactions by date. Transactions
on the same date should appear in the same order as their CSV records, on the same date should appear in the same order as their CSV records,
as hledger can usually auto-detect whether the CSV's normal order is as hledger can usually auto-detect whether the CSV's normal order is
oldest first or newest first. But if all of the following are true: oldest first or newest first. But if all of the following are true:
o the CSV might sometimes contain just one day of data (all records o the CSV might sometimes contain just one day of data (all records
having the same date) having the same date)
o the CSV records are normally in reverse chronological order (newest o the CSV records are normally in reverse chronological order (newest
at the top) at the top)
o and you care about preserving the order of same-day transactions o and you care about preserving the order of same-day transactions
@ -553,9 +558,9 @@ CSV RULES
include include
include RULESFILE include RULESFILE
This includes the contents of another CSV rules file at this point. This includes the contents of another CSV rules file at this point.
RULESFILE is an absolute file path or a path relative to the current RULESFILE is an absolute file path or a path relative to the current
file's directory. This can be useful for sharing common rules between file's directory. This can be useful for sharing common rules between
several rules files, eg: several rules files, eg:
# someaccount.csv.rules # someaccount.csv.rules
@ -570,10 +575,10 @@ CSV RULES
balance-type balance-type
Balance assertions generated by assigning to balanceN are of the simple Balance assertions generated by assigning to balanceN are of the simple
= type by default, which is a single-commodity, subaccount-excluding = type by default, which is a single-commodity, subaccount-excluding
assertion. You may find the subaccount-including variants more useful, assertion. You may find the subaccount-including variants more useful,
eg if you have created some virtual subaccounts of checking to help eg if you have created some virtual subaccounts of checking to help
with budgeting. You can select a different type of assertion with the with budgeting. You can select a different type of assertion with the
balance-type rule: balance-type rule:
# balance assertions will consider all commodities and all subaccounts # balance assertions will consider all commodities and all subaccounts
@ -588,25 +593,39 @@ CSV RULES
TIPS TIPS
Rapid feedback Rapid feedback
It's a good idea to get rapid feedback while creating/troubleshooting It's a good idea to get rapid feedback while creating/troubleshooting
CSV rules. Here's a good way, using entr from http://eradman.com/entr- CSV rules. Here's a good way, using entr from http://eradman.com/entr-
project : project :
$ ls foo.csv* | entr bash -c 'echo ----; hledger -f foo.csv print desc:SOMEDESC' $ ls foo.csv* | entr bash -c 'echo ----; hledger -f foo.csv print desc:SOMEDESC'
A desc: query (eg) is used to select just one, or a few, transactions A desc: query (eg) is used to select just one, or a few, transactions
of interest. "bash -c" is used to run multiple commands, so we can of interest. "bash -c" is used to run multiple commands, so we can
echo a separator each time the command re-runs, making it easier to echo a separator each time the command re-runs, making it easier to
read the output. read the output.
Valid CSV Valid CSV
hledger accepts CSV conforming to RFC 4180. When CSV values are en- hledger accepts CSV conforming to RFC 4180. When CSV values are en-
closed in quotes, note: closed in quotes, note:
o they must be double quotes (not single quotes) o they must be double quotes (not single quotes)
o spaces outside the quotes are not allowed o spaces outside the quotes are not allowed
File Extension
CSV ("Character Separated Values") files should be named with one of
these filename extensions: .csv, .ssv, .tsv. Or, the file path should
be prefixed with one of csv:, ssv:, tsv:. This helps hledger identify
the format and show the right error messages. For example:
$ hledger -f foo.ssv print
or:
$ cat foo | hledger -f ssv:- foo
More about this: Input files in the hledger manual.
Reading multiple CSV files Reading multiple CSV files
If you use multiple -f options to read multiple CSV files at once, If you use multiple -f options to read multiple CSV files at once,
hledger will look for a correspondingly-named rules file for each CSV hledger will look for a correspondingly-named rules file for each CSV

View File

@ -156,14 +156,14 @@ unspecified.
.nf .nf
\f[C] \f[C]
$ hledger register checking $ hledger register checking
2010/02/23 movie ticket assets:checking $-10 $-10 2010-02-23 movie ticket assets:checking $-10 $-10
\f[R] \f[R]
.fi .fi
.IP .IP
.nf .nf
\f[C] \f[C]
$ hledger register checking --date2 $ hledger register checking --date2
2010/02/19 movie ticket assets:checking $-10 $-10 2010-02-19 movie ticket assets:checking $-10 $-10
\f[R] \f[R]
.fi .fi
.PP .PP
@ -193,14 +193,14 @@ reconciliation:
.nf .nf
\f[C] \f[C]
$ hledger -f t.j register food $ hledger -f t.j register food
2015/05/30 expenses:food $10 $10 2015-05-30 expenses:food $10 $10
\f[R] \f[R]
.fi .fi
.IP .IP
.nf .nf
\f[C] \f[C]
$ hledger -f t.j register checking $ hledger -f t.j register checking
2015/06/01 assets:checking $-10 $-10 2015-06-01 assets:checking $-10 $-10
\f[R] \f[R]
.fi .fi
.PP .PP
@ -718,7 +718,7 @@ amount to have that price attached:
.nf .nf
\f[C] \f[C]
$ hledger print --explicit $ hledger print --explicit
2019/01/01 2019-01-01
(a) $1 \[at] \[Eu]2 = $1 \[at] \[Eu]2 (a) $1 \[at] \[Eu]2 = $1 \[at] \[Eu]2
\f[R] \f[R]
.fi .fi
@ -1825,12 +1825,12 @@ Some examples:
.nf .nf
\f[C] \f[C]
$ hledger print --auto $ hledger print --auto
2017/12/01 2017-12-01
expenses:food $10 expenses:food $10
assets:checking assets:checking
(liabilities:charity) $-1 (liabilities:charity) $-1
2017/12/14 2017-12-14
expenses:gifts $20 expenses:gifts $20
assets:checking assets:checking
assets:checking:gifts -$20 assets:checking:gifts -$20

View File

@ -189,10 +189,10 @@ the primary date if unspecified.
assets:checking assets:checking
$ hledger register checking $ hledger register checking
2010/02/23 movie ticket assets:checking $-10 $-10 2010-02-23 movie ticket assets:checking $-10 $-10
$ hledger register checking --date2 $ hledger register checking --date2
2010/02/19 movie ticket assets:checking $-10 $-10 2010-02-19 movie ticket assets:checking $-10 $-10
Secondary dates require some effort; you must use them consistently Secondary dates require some effort; you must use them consistently
in your journal entries and remember whether to use or not use the in your journal entries and remember whether to use or not use the
@ -218,10 +218,10 @@ easy bank reconciliation:
assets:checking ; bank cleared it on monday, date:6/1 assets:checking ; bank cleared it on monday, date:6/1
$ hledger -f t.j register food $ hledger -f t.j register food
2015/05/30 expenses:food $10 $10 2015-05-30 expenses:food $10 $10
$ hledger -f t.j register checking $ hledger -f t.j register checking
2015/06/01 assets:checking $-10 $-10 2015-06-01 assets:checking $-10 $-10
DATE should be a simple date; if the year is not specified it will DATE should be a simple date; if the year is not specified it will
use the year of the transaction's date. You can set the secondary date use the year of the transaction's date. You can set the secondary date
@ -709,7 +709,7 @@ amount to have that price attached:
(a) = $1 @ €2 (a) = $1 @ €2
$ hledger print --explicit $ hledger print --explicit
2019/01/01 2019-01-01
(a) $1 @ €2 = $1 @ €2 (a) $1 @ €2 = $1 @ €2
 
@ -1667,12 +1667,12 @@ recorded above it or in another file.
assets:checking assets:checking
$ hledger print --auto $ hledger print --auto
2017/12/01 2017-12-01
expenses:food $10 expenses:food $10
assets:checking assets:checking
(liabilities:charity) $-1 (liabilities:charity) $-1
2017/12/14 2017-12-14
expenses:gifts $20 expenses:gifts $20
assets:checking assets:checking
assets:checking:gifts -$20 assets:checking:gifts -$20

View File

@ -134,10 +134,10 @@ FILE FORMAT
assets:checking assets:checking
$ hledger register checking $ hledger register checking
2010/02/23 movie ticket assets:checking $-10 $-10 2010-02-23 movie ticket assets:checking $-10 $-10
$ hledger register checking --date2 $ hledger register checking --date2
2010/02/19 movie ticket assets:checking $-10 $-10 2010-02-19 movie ticket assets:checking $-10 $-10
Secondary dates require some effort; you must use them consistently in Secondary dates require some effort; you must use them consistently in
your journal entries and remember whether to use or not use the --date2 your journal entries and remember whether to use or not use the --date2
@ -158,10 +158,10 @@ FILE FORMAT
assets:checking ; bank cleared it on monday, date:6/1 assets:checking ; bank cleared it on monday, date:6/1
$ hledger -f t.j register food $ hledger -f t.j register food
2015/05/30 expenses:food $10 $10 2015-05-30 expenses:food $10 $10
$ hledger -f t.j register checking $ hledger -f t.j register checking
2015/06/01 assets:checking $-10 $-10 2015-06-01 assets:checking $-10 $-10
DATE should be a simple date; if the year is not specified it will use DATE should be a simple date; if the year is not specified it will use
the year of the transaction's date. You can set the secondary date the year of the transaction's date. You can set the secondary date
@ -525,7 +525,7 @@ FILE FORMAT
(a) = $1 @ EUR2 (a) = $1 @ EUR2
$ hledger print --explicit $ hledger print --explicit
2019/01/01 2019-01-01
(a) $1 @ EUR2 = $1 @ EUR2 (a) $1 @ EUR2 = $1 @ EUR2
Transaction prices Transaction prices
@ -1332,12 +1332,12 @@ FILE FORMAT
assets:checking assets:checking
$ hledger print --auto $ hledger print --auto
2017/12/01 2017-12-01
expenses:food $10 expenses:food $10
assets:checking assets:checking
(liabilities:charity) $-1 (liabilities:charity) $-1
2017/12/14 2017-12-14
expenses:gifts $20 expenses:gifts $20
assets:checking assets:checking
assets:checking:gifts -$20 assets:checking:gifts -$20

View File

@ -36,13 +36,13 @@ entries:
.nf .nf
\f[C] \f[C]
$ hledger -f t.timeclock print $ hledger -f t.timeclock print
2015/03/30 * optional description after two spaces 2015-03-30 * optional description after two spaces
(some:account name) 0.33h (some:account name) 0.33h
2015/03/31 * 22:21-23:59 2015-03-31 * 22:21-23:59
(another account) 1.64h (another account) 1.64h
2015/04/01 * 00:00-02:00 2015-04-01 * 00:00-02:00
(another account) 2.01h (another account) 2.01h
\f[R] \f[R]
.fi .fi

View File

@ -25,13 +25,13 @@ one day, it is split into several transactions, one for each day. For
the above time log, 'hledger print' generates these journal entries: the above time log, 'hledger print' generates these journal entries:
$ hledger -f t.timeclock print $ hledger -f t.timeclock print
2015/03/30 * optional description after two spaces 2015-03-30 * optional description after two spaces
(some:account name) 0.33h (some:account name) 0.33h
2015/03/31 * 22:21-23:59 2015-03-31 * 22:21-23:59
(another account) 1.64h (another account) 1.64h
2015/04/01 * 00:00-02:00 2015-04-01 * 00:00-02:00
(another account) 2.01h (another account) 2.01h
Here is a sample.timeclock to download and some queries to try: Here is a sample.timeclock to download and some queries to try:

View File

@ -25,13 +25,13 @@ DESCRIPTION
the above time log, hledger print generates these journal entries: the above time log, hledger print generates these journal entries:
$ hledger -f t.timeclock print $ hledger -f t.timeclock print
2015/03/30 * optional description after two spaces 2015-03-30 * optional description after two spaces
(some:account name) 0.33h (some:account name) 0.33h
2015/03/31 * 22:21-23:59 2015-03-31 * 22:21-23:59
(another account) 1.64h (another account) 1.64h
2015/04/01 * 00:00-02:00 2015-04-01 * 00:00-02:00
(another account) 2.01h (another account) 2.01h
Here is a sample.timeclock to download and some queries to try: Here is a sample.timeclock to download and some queries to try:

View File

@ -81,10 +81,10 @@ Reporting:
.nf .nf
\f[C] \f[C]
$ hledger -f t.timedot print date:2016/2/2 $ hledger -f t.timedot print date:2016/2/2
2016/02/02 * 2016-02-02 *
(inc:client1) 2.00 (inc:client1) 2.00
2016/02/02 * 2016-02-02 *
(biz:research) 0.25 (biz:research) 0.25
\f[R] \f[R]
.fi .fi
@ -92,9 +92,9 @@ $ hledger -f t.timedot print date:2016/2/2
.nf .nf
\f[C] \f[C]
$ hledger -f t.timedot bal --daily --tree $ hledger -f t.timedot bal --daily --tree
Balance changes in 2016/02/01-2016/02/03: Balance changes in 2016-02-01-2016-02-03:
|| 2016/02/01d 2016/02/02d 2016/02/03d || 2016-02-01d 2016-02-02d 2016-02-03d
============++======================================== ============++========================================
biz || 0.25 0.25 1.00 biz || 0.25 0.25 1.00
research || 0.25 0.25 1.00 research || 0.25 0.25 1.00

View File

@ -71,16 +71,16 @@ biz:research 1
Reporting: Reporting:
$ hledger -f t.timedot print date:2016/2/2 $ hledger -f t.timedot print date:2016/2/2
2016/02/02 * 2016-02-02 *
(inc:client1) 2.00 (inc:client1) 2.00
2016/02/02 * 2016-02-02 *
(biz:research) 0.25 (biz:research) 0.25
$ hledger -f t.timedot bal --daily --tree $ hledger -f t.timedot bal --daily --tree
Balance changes in 2016/02/01-2016/02/03: Balance changes in 2016-02-01-2016-02-03:
|| 2016/02/01d 2016/02/02d 2016/02/03d || 2016-02-01d 2016-02-02d 2016-02-03d
============++======================================== ============++========================================
biz || 0.25 0.25 1.00 biz || 0.25 0.25 1.00
research || 0.25 0.25 1.00 research || 0.25 0.25 1.00

View File

@ -62,16 +62,16 @@ FILE FORMAT
Reporting: Reporting:
$ hledger -f t.timedot print date:2016/2/2 $ hledger -f t.timedot print date:2016/2/2
2016/02/02 * 2016-02-02 *
(inc:client1) 2.00 (inc:client1) 2.00
2016/02/02 * 2016-02-02 *
(biz:research) 0.25 (biz:research) 0.25
$ hledger -f t.timedot bal --daily --tree $ hledger -f t.timedot bal --daily --tree
Balance changes in 2016/02/01-2016/02/03: Balance changes in 2016-02-01-2016-02-03:
|| 2016/02/01d 2016/02/02d 2016/02/03d || 2016-02-01d 2016-02-02d 2016-02-03d
============++======================================== ============++========================================
biz || 0.25 0.25 1.00 biz || 0.25 0.25 1.00
research || 0.25 0.25 1.00 research || 0.25 0.25 1.00

View File

@ -64,6 +64,13 @@ listen on this IP address (default: 127.0.0.1)
\f[B]\f[CB]--port=PORT\f[B]\f[R] \f[B]\f[CB]--port=PORT\f[B]\f[R]
listen on this TCP port (default: 5000) listen on this TCP port (default: 5000)
.TP .TP
\f[B]\f[CB]--socket=SOCKETFILE\f[B]\f[R]
use a unix domain socket file to listen for requests instead of a TCP
socket.
Implies \f[C]--serve\f[R].
It can only be used if the operating system can provide this type of
socket.
.TP
\f[B]\f[CB]--base-url=URL\f[B]\f[R] \f[B]\f[CB]--base-url=URL\f[B]\f[R]
set the base url (default: http://IPADDR:PORT). set the base url (default: http://IPADDR:PORT).
You would change this when sharing over the network, or integrating You would change this when sharing over the network, or integrating
@ -210,6 +217,26 @@ to listen on all configured addresses.
Similarly, use \f[C]--port\f[R] to set a TCP port other than 5000, eg if Similarly, use \f[C]--port\f[R] to set a TCP port other than 5000, eg if
you are running multiple hledger-web instances. you are running multiple hledger-web instances.
.PP .PP
Both of these options are ignored when \f[C]--socket\f[R] is used.
In this case, it creates an \f[C]AF_UNIX\f[R] socket file at the
supplied path and uses that for communication.
This is an alternative way of running multiple hledger-web instances
behind a reverse proxy that handles authentication for different users.
The path can be derived in a predictable way, eg by using the username
within the path.
As an example, \f[C]nginx\f[R] as reverse proxy can use the variabel
\f[C]$remote_user\f[R] to derive a path from the username used in a HTTP
basic authentication.
The following \f[C]proxy_pass\f[R] directive allows access to all
\f[C]hledger-web\f[R] instances that created a socket in
\f[C]/tmp/hledger/\f[R]:
.IP
.nf
\f[C]
proxy_pass http://unix:/tmp/hledger/${remote_user}.socket;
\f[R]
.fi
.PP
You can use \f[C]--base-url\f[R] to change the protocol, hostname, port You can use \f[C]--base-url\f[R] to change the protocol, hostname, port
and path that appear in hyperlinks, useful eg for integrating and path that appear in hyperlinks, useful eg for integrating
hledger-web within a larger website. hledger-web within a larger website.

View File

@ -60,6 +60,11 @@ before options, as shown in the synopsis above.
'--port=PORT' '--port=PORT'
listen on this TCP port (default: 5000) listen on this TCP port (default: 5000)
'--socket=SOCKETFILE'
use a unix domain socket file to listen for requests instead of a
TCP socket. Implies '--serve'. It can only be used if the
operating system can provide this type of socket.
'--base-url=URL' '--base-url=URL'
set the base url (default: http://IPADDR:PORT). You would change set the base url (default: http://IPADDR:PORT). You would change
@ -209,6 +214,19 @@ only to local requests. You can use '--host' to change this, eg '--host
Similarly, use '--port' to set a TCP port other than 5000, eg if you Similarly, use '--port' to set a TCP port other than 5000, eg if you
are running multiple hledger-web instances. are running multiple hledger-web instances.
Both of these options are ignored when '--socket' is used. In this
case, it creates an 'AF_UNIX' socket file at the supplied path and uses
that for communication. This is an alternative way of running multiple
hledger-web instances behind a reverse proxy that handles authentication
for different users. The path can be derived in a predictable way, eg
by using the username within the path. As an example, 'nginx' as
reverse proxy can use the variabel '$remote_user' to derive a path from
the username used in a HTTP basic authentication. The following
'proxy_pass' directive allows access to all 'hledger-web' instances that
created a socket in '/tmp/hledger/':
proxy_pass http://unix:/tmp/hledger/${remote_user}.socket;
You can use '--base-url' to change the protocol, hostname, port and You can use '--base-url' to change the protocol, hostname, port and
path that appear in hyperlinks, useful eg for integrating hledger-web path that appear in hyperlinks, useful eg for integrating hledger-web
within a larger website. The default is 'http://HOST:PORT/' using the within a larger website. The default is 'http://HOST:PORT/' using the
@ -343,14 +361,14 @@ Tag Table:
Node: Top72 Node: Top72
Node: OPTIONS1361 Node: OPTIONS1361
Ref: #options1466 Ref: #options1466
Node: PERMISSIONS6790 Node: PERMISSIONS7739
Ref: #permissions6929 Ref: #permissions7878
Node: EDITING UPLOADING DOWNLOADING8141 Node: EDITING UPLOADING DOWNLOADING9090
Ref: #editing-uploading-downloading8322 Ref: #editing-uploading-downloading9271
Node: RELOADING9156 Node: RELOADING10105
Ref: #reloading9290 Ref: #reloading10239
Node: JSON API9723 Node: JSON API10672
Ref: #json-api9817 Ref: #json-api10766
 
End Tag Table End Tag Table

View File

@ -56,6 +56,11 @@ OPTIONS
--port=PORT --port=PORT
listen on this TCP port (default: 5000) listen on this TCP port (default: 5000)
--socket=SOCKETFILE
use a unix domain socket file to listen for requests instead of
a TCP socket. Implies --serve. It can only be used if the op-
erating system can provide this type of socket.
--base-url=URL --base-url=URL
set the base url (default: http://IPADDR:PORT). You would set the base url (default: http://IPADDR:PORT). You would
change this when sharing over the network, or integrating within change this when sharing over the network, or integrating within
@ -200,22 +205,35 @@ OPTIONS
Similarly, use --port to set a TCP port other than 5000, eg if you are Similarly, use --port to set a TCP port other than 5000, eg if you are
running multiple hledger-web instances. running multiple hledger-web instances.
You can use --base-url to change the protocol, hostname, port and path Both of these options are ignored when --socket is used. In this case,
it creates an AF_UNIX socket file at the supplied path and uses that
for communication. This is an alternative way of running multiple
hledger-web instances behind a reverse proxy that handles authentica-
tion for different users. The path can be derived in a predictable
way, eg by using the username within the path. As an example, nginx as
reverse proxy can use the variabel $remote_user to derive a path from
the username used in a HTTP basic authentication. The following
proxy_pass directive allows access to all hledger-web instances that
created a socket in /tmp/hledger/:
proxy_pass http://unix:/tmp/hledger/${remote_user}.socket;
You can use --base-url to change the protocol, hostname, port and path
that appear in hyperlinks, useful eg for integrating hledger-web within that appear in hyperlinks, useful eg for integrating hledger-web within
a larger website. The default is http://HOST:PORT/ using the server's a larger website. The default is http://HOST:PORT/ using the server's
configured host address and TCP port (or http://HOST if PORT is 80). configured host address and TCP port (or http://HOST if PORT is 80).
With --file-url you can set a different base url for static files, eg With --file-url you can set a different base url for static files, eg
for better caching or cookie-less serving on high performance websites. for better caching or cookie-less serving on high performance websites.
PERMISSIONS PERMISSIONS
By default, hledger-web allows anyone who can reach it to view the By default, hledger-web allows anyone who can reach it to view the
journal and to add new transactions, but not to change existing data. journal and to add new transactions, but not to change existing data.
You can restrict who can reach it by You can restrict who can reach it by
o setting the IP address it listens on (see --host above). By default o setting the IP address it listens on (see --host above). By default
it listens on 127.0.0.1, accessible to all users on the local ma- it listens on 127.0.0.1, accessible to all users on the local ma-
chine. chine.
o putting it behind an authenticating proxy, using eg apache or nginx o putting it behind an authenticating proxy, using eg apache or nginx
@ -225,44 +243,44 @@ PERMISSIONS
You can restrict what the users who reach it can do, by You can restrict what the users who reach it can do, by
o using the --capabilities=CAP[,CAP..] flag when you start it, enabling o using the --capabilities=CAP[,CAP..] flag when you start it, enabling
one or more of the following capabilities. The default value is one or more of the following capabilities. The default value is
view,add: view,add:
o view - allows viewing the journal file and all included files o view - allows viewing the journal file and all included files
o add - allows adding new transactions to the main journal file o add - allows adding new transactions to the main journal file
o manage - allows editing, uploading or downloading the main or in- o manage - allows editing, uploading or downloading the main or in-
cluded files cluded files
o using the --capabilities-header=HTTPHEADER flag to specify a HTTP o using the --capabilities-header=HTTPHEADER flag to specify a HTTP
header from which it will read capabilities to enable. hledger-web header from which it will read capabilities to enable. hledger-web
on Sandstorm uses the X-Sandstorm-Permissions header to integrate on Sandstorm uses the X-Sandstorm-Permissions header to integrate
with Sandstorm's permissions. This is disabled by default. with Sandstorm's permissions. This is disabled by default.
EDITING, UPLOADING, DOWNLOADING EDITING, UPLOADING, DOWNLOADING
If you enable the manage capability mentioned above, you'll see a new If you enable the manage capability mentioned above, you'll see a new
"spanner" button to the right of the search form. Clicking this will "spanner" button to the right of the search form. Clicking this will
let you edit, upload, or download the journal file or any files it in- let you edit, upload, or download the journal file or any files it in-
cludes. cludes.
Note, unlike any other hledger command, in this mode you (or any visi- Note, unlike any other hledger command, in this mode you (or any visi-
tor) can alter or wipe the data files. tor) can alter or wipe the data files.
Normally whenever a file is changed in this way, hledger-web saves a Normally whenever a file is changed in this way, hledger-web saves a
numbered backup (assuming file permissions allow it, the disk is not numbered backup (assuming file permissions allow it, the disk is not
full, etc.) hledger-web is not aware of version control systems, cur- full, etc.) hledger-web is not aware of version control systems, cur-
rently; if you use one, you'll have to arrange to commit the changes rently; if you use one, you'll have to arrange to commit the changes
yourself (eg with a cron job or a file watcher like entr). yourself (eg with a cron job or a file watcher like entr).
Changes which would leave the journal file(s) unparseable or non-valid Changes which would leave the journal file(s) unparseable or non-valid
(eg with failing balance assertions) are prevented. (Probably. This (eg with failing balance assertions) are prevented. (Probably. This
needs re-testing.) needs re-testing.)
RELOADING RELOADING
hledger-web detects changes made to the files by other means (eg if you hledger-web detects changes made to the files by other means (eg if you
edit it directly, outside of hledger-web), and it will show the new edit it directly, outside of hledger-web), and it will show the new
data when you reload the page or navigate to a new page. If a change data when you reload the page or navigate to a new page. If a change
makes a file unparseable, hledger-web will display an error message un- makes a file unparseable, hledger-web will display an error message un-
til the file has been fixed. til the file has been fixed.
@ -270,8 +288,8 @@ RELOADING
that both machine clocks are roughly in step.) that both machine clocks are roughly in step.)
JSON API JSON API
In addition to the web UI, hledger-web provides some API routes that In addition to the web UI, hledger-web provides some API routes that
serve JSON in response to GET requests. (And when started with serve JSON in response to GET requests. (And when started with
--serve-api, it provides only these routes.): --serve-api, it provides only these routes.):
/accountnames /accountnames
@ -281,17 +299,17 @@ JSON API
/accounts /accounts
/accounttransactions/#AccountName /accounttransactions/#AccountName
Also, you can append a new transaction to the journal by sending a PUT Also, you can append a new transaction to the journal by sending a PUT
request to /add (hledger-web only). As with the web UI's add form, request to /add (hledger-web only). As with the web UI's add form,
hledger-web must be started with the add capability for this (enabled hledger-web must be started with the add capability for this (enabled
by default). by default).
The payload should be a valid hledger transaction as JSON, similar to The payload should be a valid hledger transaction as JSON, similar to
what you get from /transactions or /accounttransactions. what you get from /transactions or /accounttransactions.
Another way to generate test data is with the readJsonFile/writeJson- Another way to generate test data is with the readJsonFile/writeJson-
File helpers in Hledger.Web.Json, which read or write any of hledger's File helpers in Hledger.Web.Json, which read or write any of hledger's
JSON-capable types from or to a file. Eg here we write the first JSON-capable types from or to a file. Eg here we write the first
transaction of a sample journal: transaction of a sample journal:
$ make ghci-web $ make ghci-web
@ -306,23 +324,23 @@ JSON API
$ curl -s http://127.0.0.1:5000/add -X PUT -H 'Content-Type: application/json' --data-binary @txn.pretty.json; echo $ curl -s http://127.0.0.1:5000/add -X PUT -H 'Content-Type: application/json' --data-binary @txn.pretty.json; echo
By default, both the server-side HTML UI and the JSON API are served. By default, both the server-side HTML UI and the JSON API are served.
Running with --serve-api disables the former, useful if you only want Running with --serve-api disables the former, useful if you only want
to serve the API. to serve the API.
ENVIRONMENT ENVIRONMENT
LEDGER_FILE The journal file path when not specified with -f. Default: LEDGER_FILE The journal file path when not specified with -f. Default:
~/.hledger.journal (on windows, perhaps C:/Users/USER/.hledger.jour- ~/.hledger.journal (on windows, perhaps C:/Users/USER/.hledger.jour-
nal). nal).
FILES FILES
Reads data from one or more files in hledger journal, timeclock, time- Reads data from one or more files in hledger journal, timeclock, time-
dot, or CSV format specified with -f, or $LEDGER_FILE, or dot, or CSV format specified with -f, or $LEDGER_FILE, or
$HOME/.hledger.journal (on windows, perhaps $HOME/.hledger.journal (on windows, perhaps
C:/Users/USER/.hledger.journal). C:/Users/USER/.hledger.journal).
BUGS BUGS
The need to precede options with -- when invoked from hledger is awk- The need to precede options with -- when invoked from hledger is awk-
ward. ward.
-f- doesn't work (hledger-web can't read from stdin). -f- doesn't work (hledger-web can't read from stdin).
@ -336,7 +354,7 @@ BUGS
REPORTING BUGS REPORTING BUGS
Report bugs at http://bugs.hledger.org (or on the #hledger IRC channel Report bugs at http://bugs.hledger.org (or on the #hledger IRC channel
or hledger mail list) or hledger mail list)
@ -350,7 +368,7 @@ COPYRIGHT
SEE ALSO SEE ALSO
hledger(1), hledger-ui(1), hledger-web(1), hledger-api(1), hledger(1), hledger-ui(1), hledger-web(1), hledger-api(1),
hledger_csv(5), hledger_journal(5), hledger_timeclock(5), hledger_time- hledger_csv(5), hledger_journal(5), hledger_timeclock(5), hledger_time-
dot(5), ledger(1) dot(5), ledger(1)

View File

@ -13,6 +13,10 @@ balances", or you can customise these with the --close-to and
--open-from options. You can choose to print just one of the --open-from options. You can choose to print just one of the
transactions by using the --opening or --closing flag. transactions by using the --opening or --closing flag.
The equity postings appear at the end of the transaction by default;
with --interleaved, they appear beside their corresponding closing
postings.
If you split your journal files by time (eg yearly), you will typically If you split your journal files by time (eg yearly), you will typically
run this command at the end of the year, and save the closing run this command at the end of the year, and save the closing
transaction as last entry of the old file, and the opening transaction transaction as last entry of the old file, and the opening transaction

View File

@ -34,13 +34,17 @@ $ hledger print
assets:bank:checking $-1 assets:bank:checking $-1
Normally, the journal entry's explicit or implicit amount style is Normally, the journal entry's explicit or implicit amount style is
preserved. Ie when an amount is omitted in the journal, it will be preserved. For example, when an amount is omitted in the journal, it
omitted in the output. You can use the -x/--explicit flag to make all will not appear in the output. Similarly, when a transaction price is
amounts explicit, which can be useful for troubleshooting or for making implied but not written, it will not appear in the output. You can use
your journal more readable and robust against data entry errors. Note, the -x/--explicit flag to make all amounts and transaction prices
-x will cause postings with a multi-commodity amount (these can arise explicit, which can be useful for troubleshooting or for making your
when a multi-commodity transaction has an implicit amount) will be split journal more readable and robust against data entry errors.
into multiple single-commodity postings, for valid journal output.
Note, -x/--explicit will cause postings with a multi-commodity amount
(these can arise when a multi-commodity transaction has an implicit
amount) to be split into multiple single-commodity postings, keeping the
output parseable.
With -B/--cost, amounts with transaction prices are converted to cost With -B/--cost, amounts with transaction prices are converted to cost
using that price. This can be used for troubleshooting. using that price. This can be used for troubleshooting.

View File

@ -94,11 +94,11 @@ Some basic reports:
.nf .nf
\f[C] \f[C]
$ hledger print $ hledger print
2015/09/30 gift received 2015-09-30 gift received
assets:cash $20 assets:cash $20
income:gifts $-20 income:gifts $-20
2015/10/16 farmers market 2015-10-16 farmers market
expenses:food $10 expenses:food $10
assets:cash $-10 assets:cash $-10
\f[R] \f[R]
@ -130,8 +130,8 @@ $ hledger balance
.nf .nf
\f[C] \f[C]
$ hledger register cash $ hledger register cash
2015/09/30 gift received assets:cash $20 $20 2015-09-30 gift received assets:cash $20 $20
2015/10/16 farmers market assets:cash $-10 $10 2015-10-16 farmers market assets:cash $-10 $10
\f[R] \f[R]
.fi .fi
.PP .PP
@ -1210,13 +1210,13 @@ Show the cost of each posting:
.nf .nf
\f[C] \f[C]
$ hledger -f- print --value=cost $ hledger -f- print --value=cost
2000/01/01 2000-01-01
(a) 5 B (a) 5 B
2000/02/01 2000-02-01
(a) 6 B (a) 6 B
2000/03/01 2000-03-01
(a) 7 B (a) 7 B
\f[R] \f[R]
.fi .fi
@ -1240,13 +1240,13 @@ of the journal (2000-03-01):
.nf .nf
\f[C] \f[C]
$ hledger -f- print --value=end $ hledger -f- print --value=end
2000/01/01 2000-01-01
(a) 3 B (a) 3 B
2000/02/01 2000-02-01
(a) 3 B (a) 3 B
2000/03/01 2000-03-01
(a) 3 B (a) 3 B
\f[R] \f[R]
.fi .fi
@ -1272,13 +1272,13 @@ Show the value on 2000/01/15:
.nf .nf
\f[C] \f[C]
$ hledger -f- print --value=2000-01-15 $ hledger -f- print --value=2000-01-15
2000/01/01 2000-01-01
(a) 1 B (a) 1 B
2000/02/01 2000-02-01
(a) 1 B (a) 1 B
2000/03/01 2000-03-01
(a) 1 B (a) 1 B
\f[R] \f[R]
.fi .fi
@ -1300,7 +1300,7 @@ P 2000-01-01 A 2B
.nf .nf
\f[C] \f[C]
$ hledger print -x -X A $ hledger print -x -X A
2000/01/01 2000-01-01
a 0 a 0
b 0 b 0
\f[R] \f[R]
@ -1327,7 +1327,7 @@ commodity 0.00A
.nf .nf
\f[C] \f[C]
$ hledger print -X A $ hledger print -X A
2000/01/01 2000-01-01
a 0.50A a 0.50A
b -0.50A b -0.50A
\f[R] \f[R]
@ -2721,6 +2721,10 @@ balances\[dq], and the opening transaction transfers balances from
You can choose to print just one of the transactions by using the You can choose to print just one of the transactions by using the
\f[C]--opening\f[R] or \f[C]--closing\f[R] flag. \f[C]--opening\f[R] or \f[C]--closing\f[R] flag.
.PP .PP
The equity postings appear at the end of the transaction by default;
with \f[C]--interleaved\f[R], they appear beside their corresponding
closing postings.
.PP
If you split your journal files by time (eg yearly), you will typically If you split your journal files by time (eg yearly), you will typically
run this command at the end of the year, and save the closing run this command at the end of the year, and save the closing
transaction as last entry of the old file, and the opening transaction transaction as last entry of the old file, and the opening transaction
@ -3123,15 +3127,19 @@ $ hledger print
.PP .PP
Normally, the journal entry\[aq]s explicit or implicit amount style is Normally, the journal entry\[aq]s explicit or implicit amount style is
preserved. preserved.
Ie when an amount is omitted in the journal, it will be omitted in the For example, when an amount is omitted in the journal, it will not
output. appear in the output.
Similarly, when a transaction price is implied but not written, it will
not appear in the output.
You can use the \f[C]-x\f[R]/\f[C]--explicit\f[R] flag to make all You can use the \f[C]-x\f[R]/\f[C]--explicit\f[R] flag to make all
amounts explicit, which can be useful for troubleshooting or for making amounts and transaction prices explicit, which can be useful for
your journal more readable and robust against data entry errors. troubleshooting or for making your journal more readable and robust
Note, \f[C]-x\f[R] will cause postings with a multi-commodity amount against data entry errors.
(these can arise when a multi-commodity transaction has an implicit .PP
amount) will be split into multiple single-commodity postings, for valid Note, \f[C]-x\f[R]/\f[C]--explicit\f[R] will cause postings with a
journal output. multi-commodity amount (these can arise when a multi-commodity
transaction has an implicit amount) to be split into multiple
single-commodity postings, keeping the output parseable.
.PP .PP
With \f[C]-B\f[R]/\f[C]--cost\f[R], amounts with transaction prices are With \f[C]-B\f[R]/\f[C]--cost\f[R], amounts with transaction prices are
converted to cost using that price. converted to cost using that price.

View File

@ -68,11 +68,11 @@ Two simple transactions in hledger journal format:
Some basic reports: Some basic reports:
$ hledger print $ hledger print
2015/09/30 gift received 2015-09-30 gift received
assets:cash $20 assets:cash $20
income:gifts $-20 income:gifts $-20
2015/10/16 farmers market 2015-10-16 farmers market
expenses:food $10 expenses:food $10
assets:cash $-10 assets:cash $-10
@ -92,8 +92,8 @@ $ hledger balance
0 0
$ hledger register cash $ hledger register cash
2015/09/30 gift received assets:cash $20 $20 2015-09-30 gift received assets:cash $20 $20
2015/10/16 farmers market assets:cash $-10 $10 2015-10-16 farmers market assets:cash $-10 $10
More commands: More commands:
@ -932,13 +932,13 @@ P 2000-04-01 A 4 B
Show the cost of each posting: Show the cost of each posting:
$ hledger -f- print --value=cost $ hledger -f- print --value=cost
2000/01/01 2000-01-01
(a) 5 B (a) 5 B
2000/02/01 2000-02-01
(a) 6 B (a) 6 B
2000/03/01 2000-03-01
(a) 7 B (a) 7 B
Show the value as of the last day of the report period (2000-02-29): Show the value as of the last day of the report period (2000-02-29):
@ -954,13 +954,13 @@ $ hledger -f- print --value=end date:2000/01-2000/03
day of the journal (2000-03-01): day of the journal (2000-03-01):
$ hledger -f- print --value=end $ hledger -f- print --value=end
2000/01/01 2000-01-01
(a) 3 B (a) 3 B
2000/02/01 2000-02-01
(a) 3 B (a) 3 B
2000/03/01 2000-03-01
(a) 3 B (a) 3 B
Show the current value (the 2000-04-01 price is still in effect Show the current value (the 2000-04-01 price is still in effect
@ -979,13 +979,13 @@ $ hledger -f- print --value=now
Show the value on 2000/01/15: Show the value on 2000/01/15:
$ hledger -f- print --value=2000-01-15 $ hledger -f- print --value=2000-01-15
2000/01/01 2000-01-01
(a) 1 B (a) 1 B
2000/02/01 2000-02-01
(a) 1 B (a) 1 B
2000/03/01 2000-03-01
(a) 1 B (a) 1 B
You may need to explicitly set a commodity's display style, when You may need to explicitly set a commodity's display style, when
@ -998,7 +998,7 @@ P 2000-01-01 A 2B
b b
$ hledger print -x -X A $ hledger print -x -X A
2000/01/01 2000-01-01
a 0 a 0
b 0 b 0
@ -1016,7 +1016,7 @@ commodity 0.00A
b b
$ hledger print -X A $ hledger print -X A
2000/01/01 2000-01-01
a 0.50A a 0.50A
b -0.50A b -0.50A
@ -2219,6 +2219,10 @@ balances", and the opening transaction transfers balances from
'--close-to' and '--open-from' options. You can choose to print just '--close-to' and '--open-from' options. You can choose to print just
one of the transactions by using the '--opening' or '--closing' flag. one of the transactions by using the '--opening' or '--closing' flag.
The equity postings appear at the end of the transaction by default;
with '--interleaved', they appear beside their corresponding closing
postings.
If you split your journal files by time (eg yearly), you will If you split your journal files by time (eg yearly), you will
typically run this command at the end of the year, and save the closing typically run this command at the end of the year, and save the closing
transaction as last entry of the old file, and the opening transaction transaction as last entry of the old file, and the opening transaction
@ -2583,13 +2587,17 @@ $ hledger print
assets:bank:checking $-1 assets:bank:checking $-1
Normally, the journal entry's explicit or implicit amount style is Normally, the journal entry's explicit or implicit amount style is
preserved. Ie when an amount is omitted in the journal, it will be preserved. For example, when an amount is omitted in the journal, it
omitted in the output. You can use the '-x'/'--explicit' flag to make will not appear in the output. Similarly, when a transaction price is
all amounts explicit, which can be useful for troubleshooting or for implied but not written, it will not appear in the output. You can use
making your journal more readable and robust against data entry errors. the '-x'/'--explicit' flag to make all amounts and transaction prices
Note, '-x' will cause postings with a multi-commodity amount (these can explicit, which can be useful for troubleshooting or for making your
arise when a multi-commodity transaction has an implicit amount) will be journal more readable and robust against data entry errors.
split into multiple single-commodity postings, for valid journal output.
Note, '-x'/'--explicit' will cause postings with a multi-commodity
amount (these can arise when a multi-commodity transaction has an
implicit amount) to be split into multiple single-commodity postings,
keeping the output parseable.
With '-B'/'--cost', amounts with transaction prices are converted to With '-B'/'--cost', amounts with transaction prices are converted to
cost using that price. This can be used for troubleshooting. cost using that price. This can be used for troubleshooting.
@ -3292,74 +3300,74 @@ Node: check-dupes76317
Ref: #check-dupes76441 Ref: #check-dupes76441
Node: close76734 Node: close76734
Ref: #close76848 Ref: #close76848
Node: commodities80514 Node: commodities80666
Ref: #commodities80641 Ref: #commodities80793
Node: descriptions80723 Node: descriptions80875
Ref: #descriptions80851 Ref: #descriptions81003
Node: diff81032 Node: diff81184
Ref: #diff81138 Ref: #diff81290
Node: files82185 Node: files82337
Ref: #files82285 Ref: #files82437
Node: help82432 Node: help82584
Ref: #help82532 Ref: #help82684
Node: import83613 Node: import83765
Ref: #import83727 Ref: #import83879
Node: Importing balance assignments84620 Node: Importing balance assignments84772
Ref: #importing-balance-assignments84768 Ref: #importing-balance-assignments84920
Node: incomestatement85417 Node: incomestatement85569
Ref: #incomestatement85550 Ref: #incomestatement85702
Node: notes86954 Node: notes87106
Ref: #notes87067 Ref: #notes87219
Node: payees87193 Node: payees87345
Ref: #payees87299 Ref: #payees87451
Node: prices87457 Node: prices87609
Ref: #prices87563 Ref: #prices87715
Node: print87904 Node: print88056
Ref: #print88014 Ref: #print88166
Node: print-unique92507 Node: print-unique92810
Ref: #print-unique92633 Ref: #print-unique92936
Node: register92918 Node: register93221
Ref: #register93045 Ref: #register93348
Node: Custom register output97217 Node: Custom register output97520
Ref: #custom-register-output97346 Ref: #custom-register-output97649
Node: register-match98608 Node: register-match98911
Ref: #register-match98742 Ref: #register-match99045
Node: rewrite99093 Node: rewrite99396
Ref: #rewrite99208 Ref: #rewrite99511
Node: Re-write rules in a file101063 Node: Re-write rules in a file101366
Ref: #re-write-rules-in-a-file101197 Ref: #re-write-rules-in-a-file101500
Node: Diff output format102407 Node: Diff output format102710
Ref: #diff-output-format102576 Ref: #diff-output-format102879
Node: rewrite vs print --auto103668 Node: rewrite vs print --auto103971
Ref: #rewrite-vs.-print---auto103847 Ref: #rewrite-vs.-print---auto104150
Node: roi104403 Node: roi104706
Ref: #roi104501 Ref: #roi104804
Node: stats105513 Node: stats105816
Ref: #stats105612 Ref: #stats105915
Node: tags106400 Node: tags106703
Ref: #tags106498 Ref: #tags106801
Node: test106792 Node: test107095
Ref: #test106876 Ref: #test107179
Node: ADD-ON COMMANDS107623 Node: ADD-ON COMMANDS107926
Ref: #add-on-commands107733 Ref: #add-on-commands108036
Node: Official add-ons109021 Node: Official add-ons109324
Ref: #official-add-ons109161 Ref: #official-add-ons109464
Node: ui109241 Node: ui109544
Ref: #ui109328 Ref: #ui109631
Node: web109382 Node: web109685
Ref: #web109471 Ref: #web109774
Node: Third party add-ons109517 Node: Third party add-ons109820
Ref: #third-party-add-ons109692 Ref: #third-party-add-ons109995
Node: iadd109811 Node: iadd110114
Ref: #iadd109912 Ref: #iadd110215
Node: interest109994 Node: interest110297
Ref: #interest110103 Ref: #interest110406
Node: Experimental add-ons110198 Node: Experimental add-ons110501
Ref: #experimental-add-ons110350 Ref: #experimental-add-ons110653
Node: autosync110588 Node: autosync110891
Ref: #autosync110699 Ref: #autosync111002
Node: chart110938 Node: chart111241
Ref: #chart111043 Ref: #chart111346
 
End Tag Table End Tag Table

View File

@ -68,11 +68,11 @@ EXAMPLES
Some basic reports: Some basic reports:
$ hledger print $ hledger print
2015/09/30 gift received 2015-09-30 gift received
assets:cash $20 assets:cash $20
income:gifts $-20 income:gifts $-20
2015/10/16 farmers market 2015-10-16 farmers market
expenses:food $10 expenses:food $10
assets:cash $-10 assets:cash $-10
@ -92,8 +92,8 @@ EXAMPLES
0 0
$ hledger register cash $ hledger register cash
2015/09/30 gift received assets:cash $20 $20 2015-09-30 gift received assets:cash $20 $20
2015/10/16 farmers market assets:cash $-10 $10 2015-10-16 farmers market assets:cash $-10 $10
More commands: More commands:
@ -829,13 +829,13 @@ OPTIONS
Show the cost of each posting: Show the cost of each posting:
$ hledger -f- print --value=cost $ hledger -f- print --value=cost
2000/01/01 2000-01-01
(a) 5 B (a) 5 B
2000/02/01 2000-02-01
(a) 6 B (a) 6 B
2000/03/01 2000-03-01
(a) 7 B (a) 7 B
Show the value as of the last day of the report period (2000-02-29): Show the value as of the last day of the report period (2000-02-29):
@ -851,13 +851,13 @@ OPTIONS
day of the journal (2000-03-01): day of the journal (2000-03-01):
$ hledger -f- print --value=end $ hledger -f- print --value=end
2000/01/01 2000-01-01
(a) 3 B (a) 3 B
2000/02/01 2000-02-01
(a) 3 B (a) 3 B
2000/03/01 2000-03-01
(a) 3 B (a) 3 B
Show the current value (the 2000-04-01 price is still in effect today): Show the current value (the 2000-04-01 price is still in effect today):
@ -875,13 +875,13 @@ OPTIONS
Show the value on 2000/01/15: Show the value on 2000/01/15:
$ hledger -f- print --value=2000-01-15 $ hledger -f- print --value=2000-01-15
2000/01/01 2000-01-01
(a) 1 B (a) 1 B
2000/02/01 2000-02-01
(a) 1 B (a) 1 B
2000/03/01 2000-03-01
(a) 1 B (a) 1 B
You may need to explicitly set a commodity's display style, when re- You may need to explicitly set a commodity's display style, when re-
@ -894,7 +894,7 @@ OPTIONS
b b
$ hledger print -x -X A $ hledger print -x -X A
2000/01/01 2000-01-01
a 0 a 0
b 0 b 0
@ -912,7 +912,7 @@ OPTIONS
b b
$ hledger print -X A $ hledger print -X A
2000/01/01 2000-01-01
a 0.50A a 0.50A
b -0.50A b -0.50A
@ -1955,6 +1955,10 @@ COMMANDS
and --open-from options. You can choose to print just one of the and --open-from options. You can choose to print just one of the
transactions by using the --opening or --closing flag. transactions by using the --opening or --closing flag.
The equity postings appear at the end of the transaction by default;
with --interleaved, they appear beside their corresponding closing
postings.
If you split your journal files by time (eg yearly), you will typically If you split your journal files by time (eg yearly), you will typically
run this command at the end of the year, and save the closing transac- run this command at the end of the year, and save the closing transac-
tion as last entry of the old file, and the opening transaction as the tion as last entry of the old file, and the opening transaction as the
@ -2253,39 +2257,42 @@ COMMANDS
assets:bank:checking $-1 assets:bank:checking $-1
Normally, the journal entry's explicit or implicit amount style is pre- Normally, the journal entry's explicit or implicit amount style is pre-
served. Ie when an amount is omitted in the journal, it will be omit- served. For example, when an amount is omitted in the journal, it will
ted in the output. You can use the -x/--explicit flag to make all not appear in the output. Similarly, when a transaction price is im-
amounts explicit, which can be useful for troubleshooting or for making plied but not written, it will not appear in the output. You can use
your journal more readable and robust against data entry errors. Note, the -x/--explicit flag to make all amounts and transaction prices ex-
-x will cause postings with a multi-commodity amount (these can arise plicit, which can be useful for troubleshooting or for making your
when a multi-commodity transaction has an implicit amount) will be journal more readable and robust against data entry errors.
split into multiple single-commodity postings, for valid journal out-
put.
With -B/--cost, amounts with transaction prices are converted to cost Note, -x/--explicit will cause postings with a multi-commodity amount
(these can arise when a multi-commodity transaction has an implicit
amount) to be split into multiple single-commodity postings, keeping
the output parseable.
With -B/--cost, amounts with transaction prices are converted to cost
using that price. This can be used for troubleshooting. using that price. This can be used for troubleshooting.
With -m/--match and a STR argument, print will show at most one trans- With -m/--match and a STR argument, print will show at most one trans-
action: the one one whose description is most similar to STR, and is action: the one one whose description is most similar to STR, and is
most recent. STR should contain at least two characters. If there is most recent. STR should contain at least two characters. If there is
no similar-enough match, no transaction will be shown. no similar-enough match, no transaction will be shown.
With --new, for each FILE being read, hledger reads (and writes) a spe- With --new, for each FILE being read, hledger reads (and writes) a spe-
cial state file (.latest.FILE in the same directory), containing the cial state file (.latest.FILE in the same directory), containing the
latest transaction date(s) that were seen last time FILE was read. latest transaction date(s) that were seen last time FILE was read.
When this file is found, only transactions with newer dates (and new When this file is found, only transactions with newer dates (and new
transactions on the latest date) are printed. This is useful for ig- transactions on the latest date) are printed. This is useful for ig-
noring already-seen entries in import data, such as downloaded CSV noring already-seen entries in import data, such as downloaded CSV
files. Eg: files. Eg:
$ hledger -f bank1.csv print --new $ hledger -f bank1.csv print --new
# shows transactions added since last print --new on this file # shows transactions added since last print --new on this file
This assumes that transactions added to FILE always have same or in- This assumes that transactions added to FILE always have same or in-
creasing dates, and that transactions on the same day do not get re- creasing dates, and that transactions on the same day do not get re-
ordered. See also the import command. ordered. See also the import command.
This command also supports output destination and output format selec- This command also supports output destination and output format selec-
tion. Here's an example of print's CSV output: tion. Here's an example of print's CSV output:
$ hledger print -Ocsv $ hledger print -Ocsv
@ -2302,20 +2309,20 @@ COMMANDS
"5","2008/12/31","","*","","pay off","","liabilities:debts","1","$","","1","","" "5","2008/12/31","","*","","pay off","","liabilities:debts","1","$","","1","",""
"5","2008/12/31","","*","","pay off","","assets:bank:checking","-1","$","1","","","" "5","2008/12/31","","*","","pay off","","assets:bank:checking","-1","$","1","","",""
o There is one CSV record per posting, with the parent transaction's o There is one CSV record per posting, with the parent transaction's
fields repeated. fields repeated.
o The "txnidx" (transaction index) field shows which postings belong to o The "txnidx" (transaction index) field shows which postings belong to
the same transaction. (This number might change if transactions are the same transaction. (This number might change if transactions are
reordered within the file, files are parsed/included in a different reordered within the file, files are parsed/included in a different
order, etc.) order, etc.)
o The amount is separated into "commodity" (the symbol) and "amount" o The amount is separated into "commodity" (the symbol) and "amount"
(numeric quantity) fields. (numeric quantity) fields.
o The numeric amount is repeated in either the "credit" or "debit" col- o The numeric amount is repeated in either the "credit" or "debit" col-
umn, for convenience. (Those names are not accurate in the account- umn, for convenience. (Those names are not accurate in the account-
ing sense; it just puts negative amounts under credit and zero or ing sense; it just puts negative amounts under credit and zero or
greater amounts under debit.) greater amounts under debit.)
print-unique print-unique
@ -2339,7 +2346,7 @@ COMMANDS
Show postings and their running total. Show postings and their running total.
The register command displays postings in date order, one per line, and The register command displays postings in date order, one per line, and
their running total. This is typically used with a query selecting a their running total. This is typically used with a query selecting a
particular account, to see that account's activity: particular account, to see that account's activity:
$ hledger register checking $ hledger register checking
@ -2350,8 +2357,8 @@ COMMANDS
With --date2, it shows and sorts by secondary date instead. With --date2, it shows and sorts by secondary date instead.
The --historical/-H flag adds the balance from any undisplayed prior The --historical/-H flag adds the balance from any undisplayed prior
postings to the running total. This is useful when you want to see postings to the running total. This is useful when you want to see
only recent activity, with a historically accurate running balance: only recent activity, with a historically accurate running balance:
$ hledger register checking -b 2008/6 --historical $ hledger register checking -b 2008/6 --historical
@ -2361,18 +2368,18 @@ COMMANDS
The --depth option limits the amount of sub-account detail displayed. The --depth option limits the amount of sub-account detail displayed.
The --average/-A flag shows the running average posting amount instead The --average/-A flag shows the running average posting amount instead
of the running total (so, the final number displayed is the average for of the running total (so, the final number displayed is the average for
the whole report period). This flag implies --empty (see below). It the whole report period). This flag implies --empty (see below). It
is affected by --historical. It works best when showing just one ac- is affected by --historical. It works best when showing just one ac-
count and one commodity. count and one commodity.
The --related/-r flag shows the other postings in the transactions of The --related/-r flag shows the other postings in the transactions of
the postings which would normally be shown. the postings which would normally be shown.
The --invert flag negates all amounts. For example, it can be used on The --invert flag negates all amounts. For example, it can be used on
an income account where amounts are normally displayed as negative num- an income account where amounts are normally displayed as negative num-
bers. It's also useful to show postings on the checking account to- bers. It's also useful to show postings on the checking account to-
gether with the related account: gether with the related account:
$ hledger register --related --invert assets:checking $ hledger register --related --invert assets:checking
@ -2384,7 +2391,7 @@ COMMANDS
2008/01 income:salary $-1 $-1 2008/01 income:salary $-1 $-1
2008/06 income:gifts $-1 $-2 2008/06 income:gifts $-1 $-2
Periods with no activity, and summary postings with a zero amount, are Periods with no activity, and summary postings with a zero amount, are
not shown by default; use the --empty/-E flag to see them: not shown by default; use the --empty/-E flag to see them:
$ hledger register --monthly income -E $ hledger register --monthly income -E
@ -2401,7 +2408,7 @@ COMMANDS
2008/11 0 $-2 2008/11 0 $-2
2008/12 0 $-2 2008/12 0 $-2
Often, you'll want to see just one line per interval. The --depth op- Often, you'll want to see just one line per interval. The --depth op-
tion helps with this, causing subaccounts to be aggregated: tion helps with this, causing subaccounts to be aggregated:
$ hledger register --monthly assets --depth 1h $ hledger register --monthly assets --depth 1h
@ -2409,17 +2416,17 @@ COMMANDS
2008/06 assets $-1 0 2008/06 assets $-1 0
2008/12 assets $-1 $-1 2008/12 assets $-1 $-1
Note when using report intervals, if you specify start/end dates these Note when using report intervals, if you specify start/end dates these
will be adjusted outward if necessary to contain a whole number of in- will be adjusted outward if necessary to contain a whole number of in-
tervals. This ensures that the first and last intervals are full tervals. This ensures that the first and last intervals are full
length and comparable to the others in the report. length and comparable to the others in the report.
Custom register output Custom register output
register uses the full terminal width by default, except on windows. register uses the full terminal width by default, except on windows.
You can override this by setting the COLUMNS environment variable (not You can override this by setting the COLUMNS environment variable (not
a bash shell variable) or by using the --width/-w option. a bash shell variable) or by using the --width/-w option.
The description and account columns normally share the space equally The description and account columns normally share the space equally
(about half of (width - 40) each). You can adjust this by adding a de- (about half of (width - 40) each). You can adjust this by adding a de-
scription width as part of --width's argument, comma-separated: --width scription width as part of --width's argument, comma-separated: --width
W,D . Here's a diagram (won't display correctly in --help): W,D . Here's a diagram (won't display correctly in --help):
@ -2437,27 +2444,27 @@ COMMANDS
$ hledger reg -w 100,40 # set overall width 100, description width 40 $ hledger reg -w 100,40 # set overall width 100, description width 40
$ hledger reg -w $COLUMNS,40 # use terminal width, & description width 40 $ hledger reg -w $COLUMNS,40 # use terminal width, & description width 40
This command also supports output destination and output format selec- This command also supports output destination and output format selec-
tion. tion.
register-match register-match
register-match register-match
Print the one posting whose transaction description is closest to DESC, Print the one posting whose transaction description is closest to DESC,
in the style of the register command. If there are multiple equally in the style of the register command. If there are multiple equally
good matches, it shows the most recent. Query options (options, not good matches, it shows the most recent. Query options (options, not
arguments) can be used to restrict the search space. Helps ledger-au- arguments) can be used to restrict the search space. Helps ledger-au-
tosync detect already-seen transactions when importing. tosync detect already-seen transactions when importing.
rewrite rewrite
rewrite rewrite
Print all transactions, rewriting the postings of matched transactions. Print all transactions, rewriting the postings of matched transactions.
For now the only rewrite available is adding new postings, like print For now the only rewrite available is adding new postings, like print
--auto. --auto.
This is a start at a generic rewriter of transaction entries. It reads This is a start at a generic rewriter of transaction entries. It reads
the default journal and prints the transactions, like print, but adds the default journal and prints the transactions, like print, but adds
one or more specified postings to any transactions matching QUERY. The one or more specified postings to any transactions matching QUERY. The
posting amounts can be fixed, or a multiplier of the existing transac- posting amounts can be fixed, or a multiplier of the existing transac-
tion's first posting amount. tion's first posting amount.
Examples: Examples:
@ -2473,7 +2480,7 @@ COMMANDS
(reserve:grocery) *0.25 ; reserve 25% for grocery (reserve:grocery) *0.25 ; reserve 25% for grocery
(reserve:) *0.25 ; reserve 25% for grocery (reserve:) *0.25 ; reserve 25% for grocery
Note the single quotes to protect the dollar sign from bash, and the Note the single quotes to protect the dollar sign from bash, and the
two spaces between account and amount. two spaces between account and amount.
More: More:
@ -2483,16 +2490,16 @@ COMMANDS
$ hledger rewrite -- expenses:gifts --add-posting '(budget:gifts) *-1"' $ hledger rewrite -- expenses:gifts --add-posting '(budget:gifts) *-1"'
$ hledger rewrite -- ^income --add-posting '(budget:foreign currency) *0.25 JPY; diversify' $ hledger rewrite -- ^income --add-posting '(budget:foreign currency) *0.25 JPY; diversify'
Argument for --add-posting option is a usual posting of transaction Argument for --add-posting option is a usual posting of transaction
with an exception for amount specification. More precisely, you can with an exception for amount specification. More precisely, you can
use '*' (star symbol) before the amount to indicate that that this is a use '*' (star symbol) before the amount to indicate that that this is a
factor for an amount of original matched posting. If the amount in- factor for an amount of original matched posting. If the amount in-
cludes a commodity name, the new posting amount will be in the new com- cludes a commodity name, the new posting amount will be in the new com-
modity; otherwise, it will be in the matched posting amount's commod- modity; otherwise, it will be in the matched posting amount's commod-
ity. ity.
Re-write rules in a file Re-write rules in a file
During the run this tool will execute so called "Automated Transac- During the run this tool will execute so called "Automated Transac-
tions" found in any journal it process. I.e instead of specifying this tions" found in any journal it process. I.e instead of specifying this
operations in command line you can put them in a journal file. operations in command line you can put them in a journal file.
@ -2507,7 +2514,7 @@ COMMANDS
budget:gifts *-1 budget:gifts *-1
assets:budget *1 assets:budget *1
Note that '=' (equality symbol) that is used instead of date in trans- Note that '=' (equality symbol) that is used instead of date in trans-
actions you usually write. It indicates the query by which you want to actions you usually write. It indicates the query by which you want to
match the posting to add new ones. match the posting to add new ones.
@ -2520,12 +2527,12 @@ COMMANDS
--add-posting 'assets:budget *1' \ --add-posting 'assets:budget *1' \
> rewritten-tidy-output.journal > rewritten-tidy-output.journal
It is important to understand that relative order of such entries in It is important to understand that relative order of such entries in
journal is important. You can re-use result of previously added post- journal is important. You can re-use result of previously added post-
ings. ings.
Diff output format Diff output format
To use this tool for batch modification of your journal files you may To use this tool for batch modification of your journal files you may
find useful output in form of unified diff. find useful output in form of unified diff.
$ hledger rewrite -- --diff -f examples/sample.journal '^income' --add-posting '(liabilities:tax) *.33' $ hledger rewrite -- --diff -f examples/sample.journal '^income' --add-posting '(liabilities:tax) *.33'
@ -2549,10 +2556,10 @@ COMMANDS
If you'll pass this through patch tool you'll get transactions contain- If you'll pass this through patch tool you'll get transactions contain-
ing the posting that matches your query be updated. Note that multiple ing the posting that matches your query be updated. Note that multiple
files might be update according to list of input files specified via files might be update according to list of input files specified via
--file options and include directives inside of these files. --file options and include directives inside of these files.
Be careful. Whole transaction being re-formatted in a style of output Be careful. Whole transaction being re-formatted in a style of output
from hledger print. from hledger print.
See also: See also:
@ -2560,48 +2567,48 @@ COMMANDS
https://github.com/simonmichael/hledger/issues/99 https://github.com/simonmichael/hledger/issues/99
rewrite vs. print --auto rewrite vs. print --auto
This command predates print --auto, and currently does much the same This command predates print --auto, and currently does much the same
thing, but with these differences: thing, but with these differences:
o with multiple files, rewrite lets rules in any file affect all other o with multiple files, rewrite lets rules in any file affect all other
files. print --auto uses standard directive scoping; rules affect files. print --auto uses standard directive scoping; rules affect
only child files. only child files.
o rewrite's query limits which transactions can be rewritten; all are o rewrite's query limits which transactions can be rewritten; all are
printed. print --auto's query limits which transactions are printed. printed. print --auto's query limits which transactions are printed.
o rewrite applies rules specified on command line or in the journal. o rewrite applies rules specified on command line or in the journal.
print --auto applies rules specified in the journal. print --auto applies rules specified in the journal.
roi roi
roi roi
Shows the time-weighted (TWR) and money-weighted (IRR) rate of return Shows the time-weighted (TWR) and money-weighted (IRR) rate of return
on your investments. on your investments.
This command assumes that you have account(s) that hold nothing but This command assumes that you have account(s) that hold nothing but
your investments and whenever you record current appraisal/valuation of your investments and whenever you record current appraisal/valuation of
these investments you offset unrealized profit and loss into account(s) these investments you offset unrealized profit and loss into account(s)
that, again, hold nothing but unrealized profit and loss. that, again, hold nothing but unrealized profit and loss.
Any transactions affecting balance of investment account(s) and not Any transactions affecting balance of investment account(s) and not
originating from unrealized profit and loss account(s) are assumed to originating from unrealized profit and loss account(s) are assumed to
be your investments or withdrawals. be your investments or withdrawals.
At a minimum, you need to supply a query (which could be just an ac- At a minimum, you need to supply a query (which could be just an ac-
count name) to select your investments with --inv, and another query to count name) to select your investments with --inv, and another query to
identify your profit and loss transactions with --pnl. identify your profit and loss transactions with --pnl.
It will compute and display the internalized rate of return (IRR) and It will compute and display the internalized rate of return (IRR) and
time-weighted rate of return (TWR) for your investments for the time time-weighted rate of return (TWR) for your investments for the time
period requested. Both rates of return are annualized before display, period requested. Both rates of return are annualized before display,
regardless of the length of reporting interval. regardless of the length of reporting interval.
stats stats
stats stats
Show some journal statistics. Show some journal statistics.
The stats command displays summary information for the whole journal, The stats command displays summary information for the whole journal,
or a matched part of it. With a reporting interval, it shows a report or a matched part of it. With a reporting interval, it shows a report
for each report period. for each report period.
Example: Example:
@ -2619,14 +2626,14 @@ COMMANDS
Commodities : 1 ($) Commodities : 1 ($)
Market prices : 12 ($) Market prices : 12 ($)
This command also supports output destination and output format selec- This command also supports output destination and output format selec-
tion. tion.
tags tags
tags tags
List all the tag names used in the journal. With a TAGREGEX argument, List all the tag names used in the journal. With a TAGREGEX argument,
only tag names matching the regular expression (case insensitive) are only tag names matching the regular expression (case insensitive) are
shown. With QUERY arguments, only transactions matching the query are shown. With QUERY arguments, only transactions matching the query are
considered. With --values flag, the tags' unique values are listed in- considered. With --values flag, the tags' unique values are listed in-
stead. stead.
@ -2634,13 +2641,13 @@ COMMANDS
test test
Run built-in unit tests. Run built-in unit tests.
This command runs the unit tests built in to hledger and hledger-lib, This command runs the unit tests built in to hledger and hledger-lib,
printing the results on stdout. If any test fails, the exit code will printing the results on stdout. If any test fails, the exit code will
be non-zero. be non-zero.
This is mainly used by hledger developers, but you can also use it to This is mainly used by hledger developers, but you can also use it to
sanity-check the installed hledger executable on your platform. All sanity-check the installed hledger executable on your platform. All
tests are expected to pass - if you ever see a failure, please report tests are expected to pass - if you ever see a failure, please report
as a bug! as a bug!
This command also accepts tasty test runner options, written after a -- This command also accepts tasty test runner options, written after a --
@ -2649,32 +2656,32 @@ COMMANDS
$ hledger test -- -pData.Amount --color=never $ hledger test -- -pData.Amount --color=never
For help on these, see https://github.com/feuerbach/tasty#options (-- For help on these, see https://github.com/feuerbach/tasty#options (--
--help currently doesn't show them). --help currently doesn't show them).
ADD-ON COMMANDS ADD-ON COMMANDS
hledger also searches for external add-on commands, and will include hledger also searches for external add-on commands, and will include
these in the commands list. These are programs or scripts in your PATH these in the commands list. These are programs or scripts in your PATH
whose name starts with hledger- and ends with a recognised file exten- whose name starts with hledger- and ends with a recognised file exten-
sion (currently: no extension, bat,com,exe, hs,lhs,pl,py,rb,rkt,sh). sion (currently: no extension, bat,com,exe, hs,lhs,pl,py,rb,rkt,sh).
Add-ons can be invoked like any hledger command, but there are a few Add-ons can be invoked like any hledger command, but there are a few
things to be aware of. Eg if the hledger-web add-on is installed, things to be aware of. Eg if the hledger-web add-on is installed,
o hledger -h web shows hledger's help, while hledger web -h shows o hledger -h web shows hledger's help, while hledger web -h shows
hledger-web's help. hledger-web's help.
o Flags specific to the add-on must have a preceding -- to hide them o Flags specific to the add-on must have a preceding -- to hide them
from hledger. So hledger web --serve --port 9000 will be rejected; from hledger. So hledger web --serve --port 9000 will be rejected;
you must use hledger web -- --serve --port 9000. you must use hledger web -- --serve --port 9000.
o You can always run add-ons directly if preferred: hledger-web --serve o You can always run add-ons directly if preferred: hledger-web --serve
--port 9000. --port 9000.
Add-ons are a relatively easy way to add local features or experiment Add-ons are a relatively easy way to add local features or experiment
with new ideas. They can be written in any language, but haskell with new ideas. They can be written in any language, but haskell
scripts have a big advantage: they can use the same hledger (and scripts have a big advantage: they can use the same hledger (and
haskell) library functions that built-in commands do, for command-line haskell) library functions that built-in commands do, for command-line
options, journal parsing, reporting, etc. options, journal parsing, reporting, etc.
Here are some hledger add-ons available: Here are some hledger add-ons available:
@ -2689,7 +2696,7 @@ ADD-ON COMMANDS
hledger-web provides a simple web interface. hledger-web provides a simple web interface.
Third party add-ons Third party add-ons
These are maintained separately, and usually updated shortly after a These are maintained separately, and usually updated shortly after a
hledger release. hledger release.
iadd iadd
@ -2701,35 +2708,35 @@ ADD-ON COMMANDS
ing to various schemes. ing to various schemes.
Experimental add-ons Experimental add-ons
These are available in source form in the hledger repo's bin/ direc- These are available in source form in the hledger repo's bin/ direc-
tory. They may be less mature and documented than built-in commands. tory. They may be less mature and documented than built-in commands.
Reading and tweaking these is a good way to start making your own! Reading and tweaking these is a good way to start making your own!
autosync autosync
hledger-autosync is a symbolic link for easily running ledger-autosync, hledger-autosync is a symbolic link for easily running ledger-autosync,
if installed. ledger-autosync does deduplicating conversion of OFX if installed. ledger-autosync does deduplicating conversion of OFX
data and some CSV formats, and can also download the data if your bank data and some CSV formats, and can also download the data if your bank
offers OFX Direct Connect. offers OFX Direct Connect.
chart chart
hledger-chart.hs is an old very basic pie chart generator. hledger-chart.hs is an old very basic pie chart generator.
ENVIRONMENT ENVIRONMENT
COLUMNS The screen width used by the register command. Default: the COLUMNS The screen width used by the register command. Default: the
full terminal width. full terminal width.
LEDGER_FILE The journal file path when not specified with -f. Default: LEDGER_FILE The journal file path when not specified with -f. Default:
~/.hledger.journal (on windows, perhaps C:/Users/USER/.hledger.jour- ~/.hledger.journal (on windows, perhaps C:/Users/USER/.hledger.jour-
nal). nal).
FILES FILES
Reads data from one or more files in hledger journal, timeclock, time- Reads data from one or more files in hledger journal, timeclock, time-
dot, or CSV format specified with -f, or $LEDGER_FILE, or dot, or CSV format specified with -f, or $LEDGER_FILE, or
$HOME/.hledger.journal (on windows, perhaps $HOME/.hledger.journal (on windows, perhaps
C:/Users/USER/.hledger.journal). C:/Users/USER/.hledger.journal).
LIMITATIONS LIMITATIONS
The need to precede addon command options with -- when invoked from The need to precede addon command options with -- when invoked from
hledger is awkward. hledger is awkward.
When input data contains non-ascii characters, a suitable system locale When input data contains non-ascii characters, a suitable system locale
@ -2745,33 +2752,33 @@ LIMITATIONS
In a Cygwin/MSYS/Mintty window, the tab key is not supported in hledger In a Cygwin/MSYS/Mintty window, the tab key is not supported in hledger
add. add.
Not all of Ledger's journal file syntax is supported. See file format Not all of Ledger's journal file syntax is supported. See file format
differences. differences.
On large data files, hledger is slower and uses more memory than On large data files, hledger is slower and uses more memory than
Ledger. Ledger.
TROUBLESHOOTING TROUBLESHOOTING
Here are some issues you might encounter when you run hledger (and re- Here are some issues you might encounter when you run hledger (and re-
member you can also seek help from the IRC channel, mail list or bug member you can also seek help from the IRC channel, mail list or bug
tracker): tracker):
Successfully installed, but "No command 'hledger' found" Successfully installed, but "No command 'hledger' found"
stack and cabal install binaries into a special directory, which should stack and cabal install binaries into a special directory, which should
be added to your PATH environment variable. Eg on unix-like systems, be added to your PATH environment variable. Eg on unix-like systems,
that is ~/.local/bin and ~/.cabal/bin respectively. that is ~/.local/bin and ~/.cabal/bin respectively.
I set a custom LEDGER_FILE, but hledger is still using the default file I set a custom LEDGER_FILE, but hledger is still using the default file
LEDGER_FILE should be a real environment variable, not just a shell LEDGER_FILE should be a real environment variable, not just a shell
variable. The command env | grep LEDGER_FILE should show it. You may variable. The command env | grep LEDGER_FILE should show it. You may
need to use export. Here's an explanation. need to use export. Here's an explanation.
"Illegal byte sequence" or "Invalid or incomplete multibyte or wide "Illegal byte sequence" or "Invalid or incomplete multibyte or wide
character" errors character" errors
In order to handle non-ascii letters and symbols (like ), hledger needs In order to handle non-ascii letters and symbols (like ), hledger needs
an appropriate locale. This is usually configured system-wide; you can an appropriate locale. This is usually configured system-wide; you can
also configure it temporarily. The locale may need to be one that sup- also configure it temporarily. The locale may need to be one that sup-
ports UTF-8, if you built hledger with GHC < 7.2 (or possibly always, ports UTF-8, if you built hledger with GHC < 7.2 (or possibly always,
I'm not sure yet). I'm not sure yet).
Here's an example of setting the locale temporarily, on ubuntu Here's an example of setting the locale temporarily, on ubuntu
@ -2790,7 +2797,7 @@ TROUBLESHOOTING
$ echo "export LANG=en_US.UTF-8" >>~/.bash_profile $ echo "export LANG=en_US.UTF-8" >>~/.bash_profile
$ bash --login $ bash --login
If we preferred to use eg fr_FR.utf8, we might have to install that If we preferred to use eg fr_FR.utf8, we might have to install that
first: first:
$ apt-get install language-pack-fr $ apt-get install language-pack-fr
@ -2811,7 +2818,7 @@ TROUBLESHOOTING
REPORTING BUGS REPORTING BUGS
Report bugs at http://bugs.hledger.org (or on the #hledger IRC channel Report bugs at http://bugs.hledger.org (or on the #hledger IRC channel
or hledger mail list) or hledger mail list)
@ -2825,7 +2832,7 @@ COPYRIGHT
SEE ALSO SEE ALSO
hledger(1), hledger-ui(1), hledger-web(1), hledger-api(1), hledger(1), hledger-ui(1), hledger-web(1), hledger-api(1),
hledger_csv(5), hledger_journal(5), hledger_timeclock(5), hledger_time- hledger_csv(5), hledger_journal(5), hledger_timeclock(5), hledger_time-
dot(5), ledger(1) dot(5), ledger(1)