2015-10-20 16:26:09 +03:00
|
|
|
|
2019-01-05 10:31:13 +03:00
|
|
|
.TH "hledger_csv" "5" "January 2019" "hledger 1.12.99" "hledger User Manuals"
|
2015-10-20 16:26:09 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.SH NAME
|
|
|
|
.PP
|
2016-04-09 23:56:09 +03:00
|
|
|
CSV \- how hledger reads CSV data, and the CSV rules file format
|
2015-10-20 16:26:09 +03:00
|
|
|
.SH DESCRIPTION
|
|
|
|
.PP
|
2017-11-29 04:20:41 +03:00
|
|
|
hledger can read CSV (comma\-separated value) files as if they were
|
|
|
|
journal files, automatically converting each CSV record into a
|
|
|
|
transaction.
|
|
|
|
(To learn about \f[I]writing\f[] CSV, see CSV output.)
|
|
|
|
.PP
|
|
|
|
Converting CSV to transactions requires some special conversion rules.
|
|
|
|
These do several things:
|
|
|
|
.IP \[bu] 2
|
|
|
|
they describe the layout and format of the CSV data
|
|
|
|
.IP \[bu] 2
|
|
|
|
they can customize the generated journal entries using a simple
|
|
|
|
templating language
|
|
|
|
.IP \[bu] 2
|
|
|
|
they can add refinements based on patterns in the CSV data, eg
|
|
|
|
categorizing transactions with more detailed account names.
|
|
|
|
.PP
|
|
|
|
When reading a CSV file named \f[C]FILE.csv\f[], hledger looks for a
|
|
|
|
conversion rules file named \f[C]FILE.csv.rules\f[] in the same
|
|
|
|
directory.
|
|
|
|
You can override this with the \f[C]\-\-rules\-file\f[] option.
|
|
|
|
If the rules file does not exist, hledger will auto\-create one with
|
2017-12-07 23:04:11 +03:00
|
|
|
some example rules, which you'll need to adjust.
|
2017-11-29 04:20:41 +03:00
|
|
|
.PP
|
|
|
|
At minimum, the rules file must identify the \f[C]date\f[] and
|
2015-10-20 16:26:09 +03:00
|
|
|
\f[C]amount\f[] fields.
|
2017-11-29 04:20:41 +03:00
|
|
|
It may also be necessary to specify the date format, and the number of
|
|
|
|
header lines to skip.
|
|
|
|
Eg:
|
|
|
|
.IP
|
|
|
|
.nf
|
|
|
|
\f[C]
|
|
|
|
fields\ date,\ _,\ _,\ amount
|
|
|
|
date\-format\ \ %d/%m/%Y
|
|
|
|
skip\ 1
|
|
|
|
\f[]
|
|
|
|
.fi
|
|
|
|
.PP
|
|
|
|
A more complete example:
|
|
|
|
.IP
|
|
|
|
.nf
|
|
|
|
\f[C]
|
|
|
|
#\ hledger\ CSV\ rules\ for\ amazon.com\ order\ history
|
|
|
|
|
|
|
|
#\ sample:
|
|
|
|
#\ "Date","Type","To/From","Name","Status","Amount","Fees","Transaction\ ID"
|
|
|
|
#\ "Jul\ 29,\ 2012","Payment","To","Adapteva,\ Inc.","Completed","$25.00","$0.00","17LA58JSK6PRD4HDGLNJQPI1PB9N8DKPVHL"
|
|
|
|
|
|
|
|
#\ skip\ one\ header\ line
|
|
|
|
skip\ 1
|
|
|
|
|
|
|
|
#\ name\ the\ csv\ fields\ (and\ assign\ the\ transaction\[aq]s\ date,\ amount\ and\ code)
|
|
|
|
fields\ date,\ _,\ toorfrom,\ name,\ amzstatus,\ amount,\ fees,\ code
|
|
|
|
|
|
|
|
#\ how\ to\ parse\ the\ date
|
|
|
|
date\-format\ %b\ %\-d,\ %Y
|
|
|
|
|
|
|
|
#\ combine\ two\ fields\ to\ make\ the\ description
|
|
|
|
description\ %toorfrom\ %name
|
|
|
|
|
|
|
|
#\ save\ these\ fields\ as\ tags
|
|
|
|
comment\ \ \ \ \ status:%amzstatus,\ fees:%fees
|
|
|
|
|
|
|
|
#\ set\ the\ base\ account\ for\ all\ transactions
|
|
|
|
account1\ \ \ \ assets:amazon
|
|
|
|
|
|
|
|
#\ flip\ the\ sign\ on\ the\ amount
|
|
|
|
amount\ \ \ \ \ \ \-%amount
|
|
|
|
\f[]
|
|
|
|
.fi
|
2015-10-20 16:26:09 +03:00
|
|
|
.PP
|
2017-11-29 04:20:41 +03:00
|
|
|
For more examples, see Convert CSV files.
|
2016-04-13 06:31:17 +03:00
|
|
|
.SH CSV RULES
|
2015-10-20 16:26:09 +03:00
|
|
|
.PP
|
2017-07-07 04:01:11 +03:00
|
|
|
The following seven kinds of rule can appear in the rules file, in any
|
2015-10-20 16:26:09 +03:00
|
|
|
order.
|
|
|
|
Blank lines and lines beginning with \f[C]#\f[] or \f[C];\f[] are
|
|
|
|
ignored.
|
2016-04-13 06:31:17 +03:00
|
|
|
.SS skip
|
|
|
|
.PP
|
2017-12-07 23:04:11 +03:00
|
|
|
\f[C]skip\f[]\f[I]\f[CI]N\f[I]\f[]
|
2015-10-20 16:26:09 +03:00
|
|
|
.PP
|
|
|
|
Skip this number of CSV records at the beginning.
|
2017-12-07 23:04:11 +03:00
|
|
|
You'll need this whenever your CSV data contains header lines.
|
2015-10-20 16:26:09 +03:00
|
|
|
Eg:
|
|
|
|
.IP
|
|
|
|
.nf
|
|
|
|
\f[C]
|
|
|
|
#\ ignore\ the\ first\ CSV\ line
|
|
|
|
skip\ 1
|
|
|
|
\f[]
|
|
|
|
.fi
|
2016-04-13 06:31:17 +03:00
|
|
|
.SS date\-format
|
|
|
|
.PP
|
2017-12-07 23:04:11 +03:00
|
|
|
\f[C]date\-format\f[]\f[I]\f[CI]DATEFMT\f[I]\f[]
|
2015-10-20 16:26:09 +03:00
|
|
|
.PP
|
|
|
|
When your CSV date fields are not formatted like \f[C]YYYY/MM/DD\f[] (or
|
2017-12-07 23:04:11 +03:00
|
|
|
\f[C]YYYY\-MM\-DD\f[] or \f[C]YYYY.MM.DD\f[]), you'll need to specify
|
|
|
|
the format.
|
2015-10-20 16:26:09 +03:00
|
|
|
DATEFMT is a strptime\-like date parsing pattern, which must parse the
|
|
|
|
date field values completely.
|
|
|
|
Examples:
|
|
|
|
.IP
|
|
|
|
.nf
|
|
|
|
\f[C]
|
2019-01-20 02:29:23 +03:00
|
|
|
#\ for\ dates\ like\ "11/06/2013":
|
|
|
|
date\-format\ %m/%d/%Y
|
2015-10-20 16:26:09 +03:00
|
|
|
\f[]
|
|
|
|
.fi
|
|
|
|
.IP
|
|
|
|
.nf
|
|
|
|
\f[C]
|
2019-01-20 02:29:23 +03:00
|
|
|
#\ for\ dates\ like\ "6/11/2013"\ (note\ the\ \-\ to\ make\ leading\ zeros\ optional):
|
|
|
|
date\-format\ %\-d/%\-m/%Y
|
2015-10-20 16:26:09 +03:00
|
|
|
\f[]
|
|
|
|
.fi
|
|
|
|
.IP
|
|
|
|
.nf
|
|
|
|
\f[C]
|
2016-04-13 06:31:17 +03:00
|
|
|
#\ for\ dates\ like\ "2013\-Nov\-06":
|
2015-10-20 16:26:09 +03:00
|
|
|
date\-format\ %Y\-%h\-%d
|
|
|
|
\f[]
|
|
|
|
.fi
|
|
|
|
.IP
|
|
|
|
.nf
|
|
|
|
\f[C]
|
2016-04-13 06:31:17 +03:00
|
|
|
#\ for\ dates\ like\ "11/6/2013\ 11:32\ PM":
|
2015-10-20 16:26:09 +03:00
|
|
|
date\-format\ %\-m/%\-d/%Y\ %l:%M\ %p
|
|
|
|
\f[]
|
|
|
|
.fi
|
2016-04-13 06:31:17 +03:00
|
|
|
.SS field list
|
2015-10-20 16:26:09 +03:00
|
|
|
.PP
|
2017-12-07 23:04:11 +03:00
|
|
|
\f[C]fields\f[]\f[I]\f[CI]FIELDNAME1\f[I]\f[],
|
|
|
|
\f[I]\f[CI]FIELDNAME2\f[I]\f[]\&...
|
2016-04-13 06:31:17 +03:00
|
|
|
.PP
|
|
|
|
This (a) names the CSV fields, in order (names may not contain
|
2016-08-02 22:55:14 +03:00
|
|
|
whitespace; uninteresting names may be left blank), and (b) assigns them
|
|
|
|
to journal entry fields if you use any of these standard field names:
|
|
|
|
\f[C]date\f[], \f[C]date2\f[], \f[C]status\f[], \f[C]code\f[],
|
|
|
|
\f[C]description\f[], \f[C]comment\f[], \f[C]account1\f[],
|
|
|
|
\f[C]account2\f[], \f[C]amount\f[], \f[C]amount\-in\f[],
|
2017-04-19 18:58:51 +03:00
|
|
|
\f[C]amount\-out\f[], \f[C]currency\f[], \f[C]balance\f[].
|
2015-10-20 16:26:09 +03:00
|
|
|
Eg:
|
|
|
|
.IP
|
|
|
|
.nf
|
|
|
|
\f[C]
|
2016-04-13 06:31:17 +03:00
|
|
|
#\ use\ the\ 1st,\ 2nd\ and\ 4th\ CSV\ fields\ as\ the\ entry\[aq]s\ date,\ description\ and\ amount,
|
|
|
|
#\ and\ give\ the\ 7th\ and\ 8th\ fields\ meaningful\ names\ for\ later\ reference:
|
|
|
|
#
|
|
|
|
#\ CSV\ field:
|
|
|
|
#\ \ \ \ \ \ 1\ \ \ \ \ 2\ \ \ \ \ \ \ \ \ \ \ \ 3\ 4\ \ \ \ \ \ \ 5\ 6\ 7\ \ \ \ \ \ \ \ \ \ 8
|
|
|
|
#\ entry\ field:
|
2015-10-20 16:26:09 +03:00
|
|
|
fields\ date,\ description,\ ,\ amount,\ ,\ ,\ somefield,\ anotherfield
|
|
|
|
\f[]
|
|
|
|
.fi
|
2016-04-13 06:31:17 +03:00
|
|
|
.SS field assignment
|
|
|
|
.PP
|
2017-12-07 23:04:11 +03:00
|
|
|
\f[I]\f[CI]ENTRYFIELDNAME\f[I]\f[] \f[I]\f[CI]FIELDVALUE\f[I]\f[]
|
2015-10-20 16:26:09 +03:00
|
|
|
.PP
|
|
|
|
This sets a journal entry field (one of the standard names above) to the
|
|
|
|
given text value, which can include CSV field values interpolated by
|
|
|
|
name (\f[C]%CSVFIELDNAME\f[]) or 1\-based position (\f[C]%N\f[]).
|
2016-04-13 06:31:17 +03:00
|
|
|
Eg:
|
2015-10-20 16:26:09 +03:00
|
|
|
.IP
|
|
|
|
.nf
|
|
|
|
\f[C]
|
|
|
|
#\ set\ the\ amount\ to\ the\ 4th\ CSV\ field\ with\ "USD\ "\ prepended
|
|
|
|
amount\ USD\ %4
|
|
|
|
\f[]
|
|
|
|
.fi
|
|
|
|
.IP
|
|
|
|
.nf
|
|
|
|
\f[C]
|
|
|
|
#\ combine\ three\ fields\ to\ make\ a\ comment\ (containing\ two\ tags)
|
|
|
|
comment\ note:\ %somefield\ \-\ %anotherfield,\ date:\ %1
|
|
|
|
\f[]
|
|
|
|
.fi
|
|
|
|
.PP
|
2016-04-13 06:31:17 +03:00
|
|
|
Field assignments can be used instead of or in addition to a field list.
|
|
|
|
.SS conditional block
|
|
|
|
.PP
|
2017-12-07 23:04:11 +03:00
|
|
|
\f[C]if\f[] \f[I]\f[CI]PATTERN\f[I]\f[]
|
2015-10-20 16:26:09 +03:00
|
|
|
.PD 0
|
|
|
|
.P
|
|
|
|
.PD
|
2017-12-07 23:04:11 +03:00
|
|
|
\ \ \ \ \f[I]\f[CI]FIELDASSIGNMENTS\f[I]\f[]\&...
|
2016-04-13 06:31:17 +03:00
|
|
|
.PP
|
|
|
|
\f[C]if\f[]
|
2015-10-20 16:26:09 +03:00
|
|
|
.PD 0
|
|
|
|
.P
|
|
|
|
.PD
|
2017-12-07 23:04:11 +03:00
|
|
|
\f[I]\f[CI]PATTERN\f[I]\f[]
|
2015-10-20 16:26:09 +03:00
|
|
|
.PD 0
|
|
|
|
.P
|
|
|
|
.PD
|
2017-12-07 23:04:11 +03:00
|
|
|
\f[I]\f[CI]PATTERN\f[I]\f[]\&...
|
2015-10-20 16:26:09 +03:00
|
|
|
.PD 0
|
|
|
|
.P
|
|
|
|
.PD
|
2017-12-07 23:04:11 +03:00
|
|
|
\ \ \ \ \f[I]\f[CI]FIELDASSIGNMENTS\f[I]\f[]\&...
|
2016-04-13 06:31:17 +03:00
|
|
|
.PP
|
2015-10-20 16:26:09 +03:00
|
|
|
This applies one or more field assignments, only to those CSV records
|
|
|
|
matched by one of the PATTERNs.
|
|
|
|
The patterns are case\-insensitive regular expressions which match
|
2017-12-07 23:04:11 +03:00
|
|
|
anywhere within the whole CSV record (it's not yet possible to match
|
2015-10-20 16:26:09 +03:00
|
|
|
within a specific field).
|
2016-08-02 22:55:14 +03:00
|
|
|
When there are multiple patterns they can be written on separate lines,
|
|
|
|
unindented.
|
2015-10-20 16:26:09 +03:00
|
|
|
The field assignments are on separate lines indented by at least one
|
|
|
|
space.
|
|
|
|
Examples:
|
|
|
|
.IP
|
|
|
|
.nf
|
|
|
|
\f[C]
|
|
|
|
#\ if\ the\ CSV\ record\ contains\ "groceries",\ set\ account2\ to\ "expenses:groceries"
|
|
|
|
if\ groceries
|
|
|
|
\ account2\ expenses:groceries
|
|
|
|
\f[]
|
|
|
|
.fi
|
|
|
|
.IP
|
|
|
|
.nf
|
|
|
|
\f[C]
|
|
|
|
#\ if\ the\ CSV\ record\ contains\ any\ of\ these\ patterns,\ set\ account2\ and\ comment\ as\ shown
|
|
|
|
if
|
|
|
|
monthly\ service\ fee
|
|
|
|
atm\ transaction\ fee
|
|
|
|
banking\ thru\ software
|
|
|
|
\ account2\ expenses:business:banking
|
2016-04-13 06:31:17 +03:00
|
|
|
\ comment\ \ XXX\ deductible\ ?\ check\ it
|
2015-10-20 16:26:09 +03:00
|
|
|
\f[]
|
|
|
|
.fi
|
2016-04-13 06:31:17 +03:00
|
|
|
.SS include
|
|
|
|
.PP
|
2017-12-07 23:04:11 +03:00
|
|
|
\f[C]include\f[]\f[I]\f[CI]RULESFILE\f[I]\f[]
|
2015-10-20 16:26:09 +03:00
|
|
|
.PP
|
|
|
|
Include another rules file at this point.
|
|
|
|
\f[C]RULESFILE\f[] is either an absolute file path or a path relative to
|
2017-12-07 23:04:11 +03:00
|
|
|
the current file's directory.
|
2015-10-20 16:26:09 +03:00
|
|
|
Eg:
|
|
|
|
.IP
|
|
|
|
.nf
|
|
|
|
\f[C]
|
|
|
|
#\ rules\ reused\ with\ several\ CSV\ files
|
|
|
|
include\ common.rules
|
|
|
|
\f[]
|
|
|
|
.fi
|
2017-07-07 04:01:11 +03:00
|
|
|
.SS newest\-first
|
|
|
|
.PP
|
|
|
|
\f[C]newest\-first\f[]
|
|
|
|
.PP
|
2017-08-15 18:17:15 +03:00
|
|
|
Consider adding this rule if all of the following are true: you might be
|
|
|
|
processing just one day of data, your CSV records are in reverse
|
2017-07-07 04:01:11 +03:00
|
|
|
chronological order (newest first), and you care about preserving the
|
2017-08-15 18:17:15 +03:00
|
|
|
order of same\-day transactions.
|
2017-12-07 23:04:11 +03:00
|
|
|
It usually isn't needed, because hledger autodetects the CSV order, but
|
|
|
|
when all CSV records have the same date it will assume they are oldest
|
|
|
|
first.
|
2017-04-19 18:58:51 +03:00
|
|
|
.SH CSV TIPS
|
2017-08-15 18:17:15 +03:00
|
|
|
.SS CSV ordering
|
2015-10-20 16:26:09 +03:00
|
|
|
.PP
|
2017-08-15 18:17:15 +03:00
|
|
|
The generated journal entries will be sorted by date.
|
|
|
|
The order of same\-day entries will be preserved (except in the special
|
|
|
|
case where you might need \f[C]newest\-first\f[], see above).
|
|
|
|
.SS CSV accounts
|
|
|
|
.PP
|
|
|
|
Each journal entry will have two postings, to \f[C]account1\f[] and
|
|
|
|
\f[C]account2\f[] respectively.
|
2017-12-07 23:04:11 +03:00
|
|
|
It's not yet possible to generate entries with more than two postings.
|
|
|
|
It's conventional and recommended to use \f[C]account1\f[] for the
|
2017-08-15 18:17:15 +03:00
|
|
|
account whose CSV we are reading.
|
|
|
|
.SS CSV amounts
|
|
|
|
.PP
|
|
|
|
The \f[C]amount\f[] field sets the amount of the \f[C]account1\f[]
|
|
|
|
posting.
|
2015-10-20 16:26:09 +03:00
|
|
|
.PP
|
|
|
|
If the CSV has debit/credit amounts in separate fields, assign to the
|
2017-08-15 18:17:15 +03:00
|
|
|
\f[C]amount\-in\f[] and \f[C]amount\-out\f[] pseudo fields instead.
|
|
|
|
(Whichever one has a value will be used, with appropriate sign.
|
|
|
|
If both contain a value, it may not work so well.)
|
2015-10-20 16:26:09 +03:00
|
|
|
.PP
|
2017-08-15 18:17:15 +03:00
|
|
|
If an amount value is parenthesised, it will be de\-parenthesised and
|
|
|
|
sign\-flipped.
|
2015-10-20 16:26:09 +03:00
|
|
|
.PP
|
2017-08-15 18:17:15 +03:00
|
|
|
If an amount value begins with a double minus sign, those will cancel
|
|
|
|
out and be removed.
|
2017-04-19 18:58:51 +03:00
|
|
|
.PP
|
2017-08-15 18:17:15 +03:00
|
|
|
If the CSV has the currency symbol in a separate field, assign that to
|
|
|
|
the \f[C]currency\f[] pseudo field to have it prepended to the amount.
|
|
|
|
Or, you can use a field assignment to \f[C]amount\f[] that interpolates
|
|
|
|
both CSV fields (giving more control, eg to put the currency symbol on
|
|
|
|
the right).
|
|
|
|
.SS CSV balance assertions
|
2015-10-20 16:26:09 +03:00
|
|
|
.PP
|
2017-08-15 18:17:15 +03:00
|
|
|
If the CSV includes a running balance, you can assign that to the
|
|
|
|
\f[C]balance\f[] pseudo field; whenever the running balance value is
|
|
|
|
non\-empty, it will be asserted as the balance after the
|
|
|
|
\f[C]account1\f[] posting.
|
2017-09-18 04:57:42 +03:00
|
|
|
.SS Reading multiple CSV files
|
|
|
|
.PP
|
|
|
|
You can read multiple CSV files at once using multiple \f[C]\-f\f[]
|
|
|
|
arguments on the command line, and hledger will look for a
|
|
|
|
correspondingly\-named rules file for each.
|
|
|
|
Note if you use the \f[C]\-\-rules\-file\f[] option, this one rules file
|
|
|
|
will be used for all the CSV files being read.
|
2015-10-20 16:26:09 +03:00
|
|
|
|
|
|
|
|
|
|
|
.SH "REPORTING BUGS"
|
2016-04-09 23:56:09 +03:00
|
|
|
Report bugs at http://bugs.hledger.org
|
|
|
|
(or on the #hledger IRC channel or hledger mail list)
|
2015-10-20 16:26:09 +03:00
|
|
|
|
|
|
|
.SH AUTHORS
|
2016-04-09 23:56:09 +03:00
|
|
|
Simon Michael <simon@joyful.com> and contributors
|
2015-10-20 16:26:09 +03:00
|
|
|
|
|
|
|
.SH COPYRIGHT
|
|
|
|
|
2016-04-09 23:56:09 +03:00
|
|
|
Copyright (C) 2007-2016 Simon Michael.
|
2015-10-20 16:26:09 +03:00
|
|
|
.br
|
2016-04-13 06:31:17 +03:00
|
|
|
Released under GNU GPL v3 or later.
|
2015-10-20 16:26:09 +03:00
|
|
|
|
|
|
|
.SH SEE ALSO
|
2016-04-09 23:56:09 +03:00
|
|
|
hledger(1), hledger\-ui(1), hledger\-web(1), hledger\-api(1),
|
2016-04-13 07:10:02 +03:00
|
|
|
hledger_csv(5), hledger_journal(5), hledger_timeclock(5), hledger_timedot(5),
|
2016-04-09 23:56:09 +03:00
|
|
|
ledger(1)
|
2015-10-20 16:26:09 +03:00
|
|
|
|
2016-04-09 23:56:09 +03:00
|
|
|
http://hledger.org
|