.. index:: csv_protocol
.. _csv_protocol/0:

.. rst-class:: right

**protocol**

``csv_protocol``
================

CSV file and stream reading and writing protocol.

| **Availability:** 
|    ``logtalk_load(csv(loader))``

| **Author:** Jacinto Dávila and Paulo Moura
| **Version:** 2:0:0
| **Date:** 2023-03-13

| **Compilation flags:**
|    ``static``


| **Dependencies:**
|   (none)


| **Remarks:**

   - Type-checking: Some of the predicate file and stream argument type-checking exceptions depend on the Prolog backend compliance with standards.

| **Inherited public predicates:**
|    (none)

.. contents::
   :local:
   :backlinks: top

Public predicates
-----------------

.. index:: read_file/3
.. _csv_protocol/0::read_file/3:

``read_file/3``
^^^^^^^^^^^^^^^

Reads a CSV file saving the data as clauses for the specified object predicate. Fails if the file cannot be parsed.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``read_file(File,Object,Predicate)``
| **Mode and number of proofs:**
|    ``read_file(+atom,+object_identifier,+predicate_indicator)`` - ``zero_or_one``

| **Exceptions:**
|    ``File`` is a variable:
|        ``instantiation_error``
|    ``File`` is neither a variable nor an atom:
|        ``type_error(atom,File)``
|    ``File`` is an atom but not an existing file:
|        ``existence_error(file,File)``
|    ``File`` is an existing file but cannot be opened for reading:
|        ``permission_error(open,source_sink,File)``
|    ``Object`` is a variable:
|        ``instantiation_error``
|    ``Object`` is neither a variable nor an object identifier:
|        ``type_error(object_identifier,Object)``
|    ``Object`` is a valid object identifier but not an existing object:
|        ``existence_error(object,Object)``
|    ``Predicate`` is a variable:
|        ``instantiation_error``
|    ``Predicate`` is neither a variable nor a predicate indicator:
|        ``type_error(predicate_indicator,Predicate)``
|    ``Predicate`` is a valid predicate indicator but not an existing public predicate:
|        ``existence_error(predicate,Predicate)``


------------

.. index:: read_stream/3
.. _csv_protocol/0::read_stream/3:

``read_stream/3``
^^^^^^^^^^^^^^^^^

Reads a CSV stream saving the data as clauses for the specified object predicate. Fails if the stream cannot be parsed.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``read_stream(Stream,Object,Predicate)``
| **Mode and number of proofs:**
|    ``read_stream(+stream_or_alias,+object_identifier,+predicate_indicator)`` - ``zero_or_one``

| **Exceptions:**
|    ``Stream`` is a variable:
|        ``instantiation_error``
|    ``Stream`` is neither a variable nor a stream-term or alias:
|        ``domain_error(stream_or_alias,Stream)``
|    ``Stream`` is not an open stream:
|        ``existence_error(stream,Stream)``
|    ``Stream`` is an output stream:
|        ``permission_error(input,stream,Stream)``
|    ``Stream`` is a binary stream:
|        ``permission_error(input,binary_stream,Stream)``
|    ``Object`` is a variable:
|        ``instantiation_error``
|    ``Object`` is neither a variable nor an object identifier:
|        ``type_error(object_identifier,Object)``
|    ``Object`` is a valid object identifier but not an existing object:
|        ``existence_error(object,Object)``
|    ``Predicate`` is a variable:
|        ``instantiation_error``
|    ``Predicate`` is neither a variable nor a predicate indicator:
|        ``type_error(predicate_indicator,Predicate)``
|    ``Predicate`` is a valid predicate indicator but not an existing public predicate:
|        ``existence_error(predicate,Predicate)``


------------

.. index:: read_file/2
.. _csv_protocol/0::read_file/2:

``read_file/2``
^^^^^^^^^^^^^^^

Reads a CSV file returning the data as a list of rows, each row a list of fields. Fails if the file cannot be parsed.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``read_file(File,Rows)``
| **Mode and number of proofs:**
|    ``read_file(+atom,-list(list))`` - ``zero_or_one``

| **Exceptions:**
|    ``File`` is a variable:
|        ``instantiation_error``
|    ``File`` is neither a variable nor an atom:
|        ``type_error(atom,File)``
|    ``File`` is an atom but not an existing file:
|        ``existence_error(file,File)``
|    ``File`` is an existing file but cannot be opened for reading:
|        ``permission_error(open,source_sink,File)``


------------

.. index:: read_stream/2
.. _csv_protocol/0::read_stream/2:

``read_stream/2``
^^^^^^^^^^^^^^^^^

Reads a CSV stream returning the data as a list of rows, each row a list of fields. Fails if the stream cannot be parsed.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``read_stream(Stream,Rows)``
| **Mode and number of proofs:**
|    ``read_stream(+stream_or_alias,-list(list))`` - ``zero_or_one``

| **Exceptions:**
|    ``Stream`` is a variable:
|        ``instantiation_error``
|    ``Stream`` is neither a variable nor a stream-term or alias:
|        ``domain_error(stream_or_alias,Stream)``
|    ``Stream`` is not an open stream:
|        ``existence_error(stream,Stream)``
|    ``Stream`` is an output stream:
|        ``permission_error(input,stream,Stream)``
|    ``Stream`` is a binary stream:
|        ``permission_error(input,binary_stream,Stream)``


------------

.. index:: read_file_by_line/3
.. _csv_protocol/0::read_file_by_line/3:

``read_file_by_line/3``
^^^^^^^^^^^^^^^^^^^^^^^

Reads a CSV file saving the data as clauses for the specified object predicate. The file is read line by line. Fails if the file cannot be parsed.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``read_file_by_line(File,Object,Predicate)``
| **Mode and number of proofs:**
|    ``read_file_by_line(+atom,+object_identifier,+predicate_indicator)`` - ``zero_or_one``

| **Exceptions:**
|    ``File`` is a variable:
|        ``instantiation_error``
|    ``File`` is neither a variable nor an atom:
|        ``type_error(atom,File)``
|    ``File`` is an atom but not an existing file:
|        ``existence_error(file,File)``
|    ``File`` is an existing file but cannot be opened for reading:
|        ``permission_error(open,source_sink,File)``
|    ``Object`` is a variable:
|        ``instantiation_error``
|    ``Object`` is neither a variable nor an object identifier:
|        ``type_error(object_identifier,Object)``
|    ``Object`` is a valid object identifier but not an existing object:
|        ``existence_error(object,Object)``
|    ``Predicate`` is a variable:
|        ``instantiation_error``
|    ``Predicate`` is neither a variable nor a predicate indicator:
|        ``type_error(predicate_indicator,Predicate)``
|    ``Predicate`` is a valid predicate indicator but not an existing public predicate:
|        ``existence_error(predicate,Predicate)``


------------

.. index:: read_stream_by_line/3
.. _csv_protocol/0::read_stream_by_line/3:

``read_stream_by_line/3``
^^^^^^^^^^^^^^^^^^^^^^^^^

Reads a CSV stream saving the data as clauses for the specified object predicate. The stream is read line by line. Fails if the stream cannot be parsed.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``read_stream_by_line(Stream,Object,Predicate)``
| **Mode and number of proofs:**
|    ``read_stream_by_line(+stream_or_alias,+object_identifier,+predicate_indicator)`` - ``zero_or_one``

| **Exceptions:**
|    ``Stream`` is a variable:
|        ``instantiation_error``
|    ``Stream`` is neither a variable nor a stream-term or alias:
|        ``domain_error(stream_or_alias,Stream)``
|    ``Stream`` is not an open stream:
|        ``existence_error(stream,Stream)``
|    ``Stream`` is an output stream:
|        ``permission_error(input,stream,Stream)``
|    ``Stream`` is a binary stream:
|        ``permission_error(input,binary_stream,Stream)``
|    ``Object`` is a variable:
|        ``instantiation_error``
|    ``Object`` is neither a variable nor an object identifier:
|        ``type_error(object_identifier,Object)``
|    ``Object`` is a valid object identifier but not an existing object:
|        ``existence_error(object,Object)``
|    ``Predicate`` is a variable:
|        ``instantiation_error``
|    ``Predicate`` is neither a variable nor a predicate indicator:
|        ``type_error(predicate_indicator,Predicate)``
|    ``Predicate`` is a valid predicate indicator but not an existing public predicate:
|        ``existence_error(predicate,Predicate)``


------------

.. index:: read_file_by_line/2
.. _csv_protocol/0::read_file_by_line/2:

``read_file_by_line/2``
^^^^^^^^^^^^^^^^^^^^^^^

Reads a CSV file returning the data as a list of rows, each row a list of fields. The file is read line by line. Fails if the file cannot be parsed.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``read_file_by_line(File,Rows)``
| **Mode and number of proofs:**
|    ``read_file_by_line(+atom,-list(list))`` - ``zero_or_one``

| **Exceptions:**
|    ``File`` is a variable:
|        ``instantiation_error``
|    ``File`` is neither a variable nor an atom:
|        ``type_error(atom,File)``
|    ``File`` is an atom but not an existing file:
|        ``existence_error(file,File)``
|    ``File`` is an existing file but cannot be opened for reading:
|        ``permission_error(open,source_sink,File)``


------------

.. index:: read_stream_by_line/2
.. _csv_protocol/0::read_stream_by_line/2:

``read_stream_by_line/2``
^^^^^^^^^^^^^^^^^^^^^^^^^

Reads a CSV stream returning the data as a list of rows, each row a list of fields. The stream is read line by line. Fails if the stream cannot be parsed.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``read_stream_by_line(Stream,Rows)``
| **Mode and number of proofs:**
|    ``read_stream_by_line(+stream_or_alias,-list(list))`` - ``zero_or_one``

| **Exceptions:**
|    ``Stream`` is a variable:
|        ``instantiation_error``
|    ``Stream`` is neither a variable nor a stream-term or alias:
|        ``domain_error(stream_or_alias,Stream)``
|    ``Stream`` is not an open stream:
|        ``existence_error(stream,Stream)``
|    ``Stream`` is an output stream:
|        ``permission_error(input,stream,Stream)``
|    ``Stream`` is a binary stream:
|        ``permission_error(input,binary_stream,Stream)``


------------

.. index:: write_file/3
.. _csv_protocol/0::write_file/3:

``write_file/3``
^^^^^^^^^^^^^^^^

Writes a CSV file with the data represented by the clauses of the specified object predicate.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``write_file(File,Object,Predicate)``
| **Mode and number of proofs:**
|    ``write_file(+atom,+object_identifier,+predicate_indicator)`` - ``one``

| **Exceptions:**
|    ``File`` is a variable:
|        ``instantiation_error``
|    ``File`` is neither a variable nor an atom:
|        ``type_error(atom,File)``
|    ``File`` is an atom but cannot be opened for writing:
|        ``permission_error(open,source_sink,File)``
|    ``Object`` is a variable:
|        ``instantiation_error``
|    ``Object`` is neither a variable nor an object identifier:
|        ``type_error(object_identifier,Object)``
|    ``Object`` is a valid object identifier but not an existing object:
|        ``existence_error(object,Object)``
|    ``Predicate`` is a variable:
|        ``instantiation_error``
|    ``Predicate`` is neither a variable nor a predicate indicator:
|        ``type_error(predicate_indicator,Predicate)``
|    ``Predicate`` is a valid predicate indicator but not an existing public predicate:
|        ``existence_error(predicate,Predicate)``


------------

.. index:: write_stream/3
.. _csv_protocol/0::write_stream/3:

``write_stream/3``
^^^^^^^^^^^^^^^^^^

Writes a CSV stream with the data represented by the clauses of the specified object predicate.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``write_stream(Stream,Object,Predicate)``
| **Mode and number of proofs:**
|    ``write_stream(+stream_or_alias,+object_identifier,+predicate_indicator)`` - ``one``

| **Exceptions:**
|    ``Stream`` is a variable:
|        ``instantiation_error``
|    ``Stream`` is neither a variable nor a stream-term or alias:
|        ``domain_error(stream_or_alias,Stream)``
|    ``Stream`` is not an open stream:
|        ``existence_error(stream,Stream)``
|    ``Stream`` is an input stream:
|        ``permission_error(output,stream,Stream)``
|    ``Stream`` is a binary stream:
|        ``permission_error(output,binary_stream,Stream)``
|    ``Object`` is a variable:
|        ``instantiation_error``
|    ``Object`` is neither a variable nor an object identifier:
|        ``type_error(object_identifier,Object)``
|    ``Object`` is a valid object identifier but not an existing object:
|        ``existence_error(object,Object)``
|    ``Predicate`` is a variable:
|        ``instantiation_error``
|    ``Predicate`` is neither a variable nor a predicate indicator:
|        ``type_error(predicate_indicator,Predicate)``
|    ``Predicate`` is a valid predicate indicator but not an existing public predicate:
|        ``existence_error(predicate,Predicate)``


------------

.. index:: guess_separator/2
.. _csv_protocol/0::guess_separator/2:

``guess_separator/2``
^^^^^^^^^^^^^^^^^^^^^

Guesses the separator used in a given file, asking the user to confirm.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``guess_separator(File,Separator)``
| **Mode and number of proofs:**
|    ``guess_separator(+atom,-atom)`` - ``one``

| **Exceptions:**
|    ``File`` is a variable:
|        ``instantiation_error``
|    ``File`` is neither a variable nor an atom:
|        ``type_error(atom,File)``
|    ``File`` is an atom but not an existing file:
|        ``existence_error(file,File)``
|    ``File`` is an atom but cannot be opened for writing:
|        ``permission_error(open,source_sink,File)``


------------

.. index:: guess_arity/2
.. _csv_protocol/0::guess_arity/2:

``guess_arity/2``
^^^^^^^^^^^^^^^^^

Guesses the arity of records in a given file, asking the user to confirm.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``guess_arity(File,Arity)``
| **Mode and number of proofs:**
|    ``guess_arity(+atom,-number)`` - ``one``

| **Exceptions:**
|    ``File`` is a variable:
|        ``instantiation_error``
|    ``File`` is neither a variable nor an atom:
|        ``type_error(atom,File)``
|    ``File`` is an atom but not an existing file:
|        ``existence_error(file,File)``
|    ``File`` is an atom but cannot be opened for writing:
|        ``permission_error(open,source_sink,File)``


------------

Protected predicates
--------------------

(none)

Private predicates
------------------

(none)

Operators
---------

(none)

