/csv

A CSV (rfc4180) erlang library

Primary LanguageErlangGNU Lesser General Public License v3.0LGPL-3.0

csv.erl
=======

csv.erl is the erlang library for csv records manipulating (rfc4180).


Build
==========

make && make test


API
==========

make/2
    Make a CSV text record from supplied fields.

put_rec/3
    Put a CSV record into a Fio.

put_recs/3
    Put all CSV records into a Fio.

put_frecs/3
    Put all CSV records into a file. Open a file with [append] modes.

put_frecs/4
    Put all CSV records into a file. Open a file with supplied modes.

parse/2
    Parse a CSV text record into fields.

get_rec/2
    Get a CSV record from a Fio.

get_recs/2
    Get all CSV records from a Fio.

get_frecs/2
    Get all CSV records from a file.

See details in doc/index.html (created by "make doc" command).
All functions get a csv record as the first argument. It contain the next fields:

sep
    a field separator
    "," - by default
quote
    a quote construct
    "\"" - by default
eor
    an end of record construct
    "\n" - by default
cb_make
    a callback for make/2.
    undefined - by default
cb_parse
    a callback for parse/2 (used by get_rec/2, get_recs/2, get_frecs/2).
    undefined - by default


Callbacks
==========

A callback take two arguments:

Opts
    csv record (see csv.hrl).
Rec
    a record.

And must return:

{ok, Rec_new}
    a converted record.
{error, Reason}
    an error.

make/2 callback is called before the main make/2 code and must convert a user
supplied data to a list of fields with which make/2 works.
For a make/2 callback, Rec is a user supplied record from a second make/2
argument. Rec_new for a make/2 callback is a list of fields to make a CSV
record from.

parse/2 callback is called after the main parse/2 code and must convert a list
of fields to a user data format.
For a parse/2 callback, Rec is a list of fields we parsed from a user supplied
text from a second parse/2 argument (a CSV text record). Rec_new for a parse/2
callback is a parsed record in a user format.


Examples
==========

The example csv file used in examples:

one,11,info1
two,22,info2

Make a csv record from fields:

1> csv:make(#csv{}, [1,2,3]).
{ok, "1,2,3\n"}

Make a csv record from fields with ; as a separator:

1> csv:make(#csv{sep = ";"}, [1,2,3]).
{ok, "1;2;3\n"}

Make a csv record from a tuple:

1> F = fun(_Opts, Rec) -> {ok, tuple_to_list(Rec)} end.
#Fun<erl_eval.12.80484245>
2> csv:make(#csv{cb_make=F}, {1,2,3}).
{ok,"1,2,3\n"}

Append csv records into a file:

1> csv:put_frecs(#csv{}, [[1, 2, "field"], [yet, "another", row]], "testfile").
ok


Read all records from a file:

1> csv:get_frecs(#csv{}, "ex.csv").
{ok,[["one","11","info1"],["two","22","info2"]]}

Read all records as tuples from a file:

1> F = fun(_Opts, Rec) -> {ok, list_to_tuple(Rec)} end.
#Fun<erl_eval.12.80484245>
2> csv:get_frecs(#csv{cb_parse=F}, "ex.csv").
{ok,[{"one","11","info1"},{"two","22","info2"}]}

Read all records as records from a file:

13> F = fun(_Opts, Rec) -> csv:cb_list_to_rec(Rec, my_rec) end. 
#Fun<erl_eval.12.80484245>
14> csv:get_frecs(#csv{cb_parse=F}, "ex.csv").            
{ok,[{my_rec, "one","11","info1"},
     {my_rec, "two","22","info2"}]}


Write records to a file(convert each field from unicode to utf8):

25> Ff = fun(Field) when is_list(Field) ->
25>   Bin = unicode:characters_to_binary(Field),
25>   binary_to_list(Bin);
25> (Field) ->
25>   Field
25> end.
#Fun<erl_eval.6.50752066>
26> Fr = fun(_Opts, Rec) ->
26>   {ok, lists:map(Ff, Rec)}
26> end.
#Fun<erl_eval.12.50752066>
27> csv:put_frecs(#csv{cb_make=Fr}, [["Тест", 1233]], "test.csv").
ok
28> csv:put_frecs(#csv{cb_make=Fr}, [["我", 123]], "test.csv").
ok