csv
¶
The csv
library provides predicates for reading and writing CSV
files:
https://www.rfc-editor.org/rfc/rfc4180.txt
The main object, csv/3
, is a parametric object allowing passing
options for the handling of the header of the file, the fields
separator, and the handling of double-quoted fields. The cvs
object
extends the csv/3
parametric object using default option values.
The library also include predicates to guess the separator and guess the number of columns in a given CSV file.
Files can be read into a list of rows (with each row being represented by a list of fields) or asserted using a user-defined dynamic predicate.
Data can be saved to a CSV file by providing the object and predicate for accessing the data plus the name of the destination file.
API documentation¶
Open the ../../docs/library_index.html#csv link in a web browser.
Loading¶
To load all entities in this library, load the loader.lgt
file:
| ?- logtalk_load(csv(loader)).
Usage¶
The csv(Header, Separator, IgnoreQuotes)
parametric object allows
passing the following options:
Header
: possible values aremissing
,skip
, andkeep
.Separator
: possible values arecomma
,tab
,semicolon
, andcolon
.IgnoreQuotes
: possible values aretrue
to ignore double quotes surrounding field data andfalse
to preserve the double quotes.
The csv
object uses the default values keep
, comma
, and
false
.
When writing CSV files, set the quoted fields option to false
to
write all non-numeric fields double-quoted (i.e. escaped).
The library objects can also be used to guess the separator used in a CSV file if necessary. For example:
| ?- csv::guess_separator('test_files/crlf_ending.csv', Separator).
Is this the proper reading of a line of this file (y/n)? [aaa,bb,ccc]
|> y.
Separator = comma ?
This information can then be used to read the CSV file returning a list of rows:
| ?- csv(keep, comma, true)::read_file('test_files/crlf_ending.csv', Rows).
Rows = [[aaa,bbb,ccc],[zzz,yyy,xxx]] ?
Alternatively, The CSV data can be saved using a public and dynamic object predicate. For example:
| ?- csv(keep, comma, true)::read_file('test_files/crlf_ending.csv', user, p/3).
** yes
| ?- p(A,B,C).
A = aaa
B = bbb
C = ccc ? ;
A = zzz
B = yyy
C = xxx
Given a predicate representing a table, the predicate data can be written to a file:
| ?- csv(keep, comma, true)::write_file('output.csv', user, p/3).
** yes
leaving the content just as the original file thanks to the use of
true
for the IgnoreQuotes
option:
aaa,bbb,ccc
zzz,yyy,xxx
Otherwise:
| ?- csv(keep, comma, false)::write_file('output.csv', user, p/3).
** yes
results in the following file content:
"aaa","bbb","ccc"
"zzz","yyy","xxx"
The guess_arity/2
method, to identify the arity, i. e. the number of
fields or columns per record in a given CSV file, for example:
| ?- csv(keep, comma, false)::guess_arity('test_files/crlf_ending.csv', Arity).
Is this the proper reading of a line of this file (y/n)? [aaa,bbb,ccc]
|> y.
Arity = 3