1:- module(
    2  csv_ext,
    3  [
    4    csv_named_row/2, % +In, -Row
    5    csv_named_row/3, % +In, -Row, +Options
    6    csv_row/2,       % +In, -Row
    7    csv_row/3        % +In, -Row, +Options
    8  ]
    9).

Enhanced CSV support

*/

   15:- use_module(library(csv)).   16:- use_module(library(dict)).   17:- use_module(library(pairs)).
 csv_named_row(+In:istream, -Row:list(pair(atom,term))) is nondet
 csv_named_row(+In:istream, -Row:list(pair(atom,term)), +Options:options) is nondet
Arguments:
Options- The following options are supported:
  • header(+list(atom)) The list of header names.
  • Other options are passed to csv_row/3.
   32csv_named_row(In, Row) :-
   33  csv_named_row(In, Row, options{}).
   34
   35
   36csv_named_row(In, Row, Options1) :-
   37  merge_dicts(options{convert: false}, Options1, Options2),
   38  (   dict_select(header, Options2, Options3, Keys)
   39  ->  csv:csv_options(Options, Options3)
   40  ;   csv:csv_options(Options, Options2),
   41      csv:csv_read_row(In, Header, Options),
   42      compound_name_arguments(Header, row, Keys)
   43  ),
   44  csv_row_(In, Values, Options),
   45  pairs_keys_values(Row, Keys, Values).
 csv_row(+In:istream, -Row:list(term)) is nondet
 csv_row(+In:istream, -Row:list(term), +Options:options) is nondet
   52csv_row(In, Row) :-
   53  csv_row(In, Row, []).
   54
   55csv_row(In, Row, Options1) :-
   56  csv:csv_options(Options2, Options1),
   57  csv_row_(In, Row, Options2).
   58
   59
   60
   61
   62
   63% HELPERS %
   64
   65csv_row_(In, Row, Options) :-
   66  repeat,
   67  csv:csv_read_row(In, Data, Options),
   68  (Data == end_of_file -> !, fail ; compound_name_arguments(Data, row, Row))