Current section
Files
Jump to
Current section
Files
src/erl_csv.erl
-module(erl_csv).
-include("erl_csv.hrl").
-export([encode/1, encode/2, decode/1, decode/2]).
-export([decode_new_s/1, decode_new_s/2, decode_s/1]).
-type encode_opts() :: #{headers => boolean() | list(),
separator => <<_:8>>,
delimiter => binary()}.
-type decode_opts() :: #{quotes => <<_:8>>,
separator => <<_:8>>,
delimiter => binary(),
regex => term()}.
-export_type([encode_opts/0, decode_opts/0]).
% @doc
% Encode a table stream into a stream of RFC 4180 compliant CSV lines for
% writing to a file or other IO.
%
% Options
%
% * `:separator' – The separator token to use, defaults to `?,'.
% Must be a codepoint (syntax: ? + your separator token).
%
% * `:delimiter' – The delimiter token to use, defaults to `\"\\r\\n\"'.
%
% * `:headers' – When set to `true', uses the keys of the first map as
% the first element in the stream. All subsequent elements are the values
% of the maps. When set to a list, will use the given list as the first
% element in the stream and order all subsequent elements using that list.
% When set to `false' (default), will use the raw inputs as elements.
% When set to anything but `false', all elements in the input stream are
% assumed to be maps.
-spec encode(iolist() | list(map())) -> iolist().
encode(Input) ->
encode(Input, #{}).
-spec encode(iolist() | list(map()), encode_opts()) -> iolist().
encode(Input, Opts) ->
erl_csv_encoder:encode(Input, Opts).
% @doc
% Decode a stream of comma-separated lines into a stream of rows.
% The Decoder expects line by line input of valid csv lines with inlined
% escape sequences if you use it directly.
%
% Options
%
% * `:separator' – The separator token to use, defaults to `?,'.
% Must be a codepoint (syntax: ? + (your separator)).
%
% * `:headers' – When set to `true', will take the first row of the csv
% and use it as header values.
% When set to a list, will use the given list as header values.
% When set to `false' (default), will use no header values.
% When set to anything but `false', the resulting rows in the matrix will
% be maps instead of lists.
-spec decode(binary()) ->
{ok, binary()} | {has_trailer, binary(), binary()} | {nomatch, binary()}.
decode(Input) ->
decode(Input, #{}).
-spec decode(binary(), decode_opts()) ->
{ok, binary()} | {has_trailer, binary(), binary()} | {nomatch, binary()}.
decode(Input, Opts) ->
erl_csv_decoder:decode(Input, Opts).
-spec decode_new_s(file:name_all()) ->
{ok, csv_stream()} | {error, term()}.
decode_new_s(Input) ->
decode_new_s(Input, #{}).
-spec decode_new_s(file:name_all(), decode_opts()) ->
{ok, csv_stream()} | {error, term()}.
decode_new_s(Input, Opts) ->
erl_csv_decoder:decode_new_s(Input, Opts).
-spec decode_s(csv_stream()) ->
{ok, iolist(), csv_stream()} | {error, term()}.
decode_s(Input) ->
erl_csv_decoder:decode_s(Input).