[gull] Truc et astuces: Lire un CSV en bash

Daniel Cordey dc at pxcluster.com
Mon Oct 18 11:00:28 CEST 2021


On 18.10.21 09:42, felix wrote:
> Ça f'sait longtemps que je n'ai pas posté un truc...
>
> Il s'agit de lire un fichier CSV conforme au
>   RFC 4180 Common Format and MIME Type for Comma-Separated Values (CSV) Files

Bon... S'il existe un RFC, celui-ci laisse aussi la porte ouverte 
concernant les "implémentations" qui peuvent varier et qui n'entrent 
donc pas dans la définition de ce standard. Entre autre, la doc du RFC 
4180 dit clairement :

Interoperability considerations:

       Due to lack of a single specification, there are considerable
       differences among implementations.  Implementors should "be
       conservative in what you do, be liberal in what you accept from
       others" (RFC 793  <https://datatracker.ietf.org/doc/html/rfc793>  [8  <https://datatracker.ietf.org/doc/html/rfc4180#ref-8>]) when processing CSV files.  An attempt at a
       common definition can be found inSection 2  <https://datatracker.ietf.org/doc/html/rfc4180#section-2>.

Aussi, la documentation du module bash CSV dit aussi :

*This method is recommended only for simple CSV files*with no text fields containing extra comma|,|delimiter, or return lines. For more complex CSV support, see the next 
section toparse CSV with AWKicon mdi-link-variant  <https://www.shell-tips.com/bash/how-to-parse-csv-file/#using-the-awk-command-line>.

J'avais d'ailleurs immédiatement pensé à AWK lorsque j'ai vu ton exemple :-)

En regardant plus en détail le module CSV de Python, j'ai trouvé ce qui 
suit :

/class/|csv.||Dialect|

    The|Dialect|
    <https://docs.python.org/3/library/csv.html#csv.Dialect>class is a
    container class whose attributes contain information for how to
    handle doublequotes, whitespace, delimiters, etc. Due to the lack of
    a strict CSV specification, different applications produce subtly
    different CSV data.|Dialect|
    <https://docs.python.org/3/library/csv.html#csv.Dialect>instances
    define how|reader|
    <https://docs.python.org/3/library/csv.html#csv.reader>and|writer|
    <https://docs.python.org/3/library/csv.html#csv.writer>instances behave.

    All available|Dialect|
    <https://docs.python.org/3/library/csv.html#csv.Dialect>names are
    returned by|list_dialects()|
    <https://docs.python.org/3/library/csv.html#csv.list_dialects>, and
    they can be registered with specific|reader|
    <https://docs.python.org/3/library/csv.html#csv.reader>and|writer|
    <https://docs.python.org/3/library/csv.html#csv.writer>classes
    through their initializer (|__init__|) functions like this:

    import  csv

    with  open('students.csv',  'w',  newline='')  as  csvfile:
         writer  =  csv.writer(csvfile,  dialect='unix')
                                      ^^^^^^^^^^^^^^

Ma conclusion est qu'une implémentation en Python nous mettra mieux à 
l'abri des variantes de CSV, en étant capable d'écrire une code plus 
lisible et évitant de gonfler le code pour traiter les cas spéciaux.

> Depuis un moment, on peut utiliser des modules chargeables dans bash, dans
> l'arborescence de la distribution, il y a un dossier d'exemples, avec
> de nombreux modules chargeables.

Merci pour cette info. En effet, ces commandes sont exécutées plus 
rapidement que celles qui se trouvent dans /usr/bin en évitant de faire 
un fork/exec. C'est donc un vrai plus au niveau performance, en plus 
d'apporter des commandes qui ne se trouvent justement pas en standard 
(comme csv).

dc
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://forum.linux-gull.ch/pipermail/gull/attachments/20211018/166d294a/attachment-0001.html>


More information about the gull mailing list