Journal autocsv2sql : un utilitaire pour convertir ses CSV sans se poser de question, "écris" en OCaml

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
10
13
mar.
2024

Cher Journal,

J'ai probablement mal cherché dans les tréfonds de l'internet, mais je rêvais depuis longtemps d'un bête utilitaire en CLI pour me convertir un CSV en SQL sans me poser de question, ie. je lui donne le fichier et il se débrouille avec les types de données, l'ordre de création de table.

C'est maintenant chose faite avec autocsv2sql, un utilitaire que j'ai "écris" en OCaml, et qui fait globalement bien le taf pour la 20aine de CSV que j'ai testé.

Alors quand je dis "écris", vous aurez compris qu'un LLM m'a beaucoup aidé à l'écrire, eh oui, je suis maintenant trop une fainéasse pour me lancer là dedans sans, et j'avoue que c'est le meilleur outil anti-procrastination que je connaisse.

Alors pour l'anecdote, il n'a évidemment pas été fichu d'écrire du code qui fonctionne, j'ai du lui décrire intégralement la fonction analyze_data_lines - et encore, j'ai du passer derrière - pour avoir une définition correcte. Deux tiers du temps a été consacré à corriger des bugs, bidouiller pour solutionner des problèmes comme le nombre de ligne et surtout gérer le ; à la place du , à la fin d'une clause INSERT.
Les Inserts sont générés par blocs de 1000 lignes pour éviter des temps de chargement interminables

Les vrais camélistes seront sans doute horrifiés devant la qualité du code : il est très impératif. En utilisant la librairie batteries, on pourrait sans doute écrire tout cela de façon bien plus élégante. Le LLM a tendance a peu utiliser les pattern match.

Vous me direz sans doute que cela existe en Python ou autre langage non compilé, mais l'intérêt avec OCaml, c'est qu'on compile, et ça ne se met pas à tomber en panne 6 mois plus tard parce que la lib pymachin est passée de la 3.1.6 à la 3.1.7

Voilà, en espérant que ça aide.

  • # sqlite? mysql?

    Posté par  . Évalué à 10.

    Alors j'ai déjà importé des csv dans sqlite super facilement. J'ai fait pareil avec mysql (tu crées une table vide avec le schéma, tu met CSV comme backend, puis tu substitue le fichier csv vide avec le tien).

    et avec sqlite3, c'est turbo simple (il prend la première ligne comme nom de colonnes):

    $ cat recette.csv
    plat,patate
    tartiflette,oui
    salade,oui
    gateau,non
    smoothie,non
    gratin dauphinois,oui
    $ sqlite3
    SQLite version 3.40.1 2022-12-28 14:03:47
    Enter ".help" for usage hints.
    Connected to a transient in-memory database.
    Use ".open FILENAME" to reopen on a persistent database.
    sqlite> .mode csv
    sqlite> .import recette.csv miam
    sqlite> select plat from miam where patate="oui";
    tartiflette
    salade
    "gratin dauphinois"
    sqlite> .quit
    $
    Après, il faut que le fichier soit bien formatté, ce genre de truc, mais c'est vraiment bien :-)

    • [^] # Re: sqlite? mysql?

      Posté par  (site web personnel) . Évalué à 3.

      Effectivement, c'est génial, mais j'utilise rarement Sqlite (qui est un produit fantastique en passant) !

      S'il a un mode pour recracher du SQL, effectivement, ce serait super !

      « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

      • [^] # Re: sqlite? mysql?

        Posté par  . Évalué à 10.

        S'il a un mode pour recracher du SQL, effectivement, ce serait super !

        $ cat recette.csv 
        plat,patate
        tartiflette,oui
        salade,oui
        gateau,non
        smoothie,non
        gratin dauphinois,oui
        $ sqlite3 
        sqlite> .mode csv
        sqlite> .import recette.csv
        sqlite> .output recette.sql
        sqlite> .dump
        sqlite> .exit
        $ cat recette.sql
        PRAGMA foreign_keys=OFF;
        BEGIN TRANSACTION;
        CREATE TABLE IF NOT EXISTS "miam"(
        "plat" TEXT, "patate" TEXT);
        INSERT INTO miam VALUES('tartiflette','oui');
        INSERT INTO miam VALUES('salade','oui');
        INSERT INTO miam VALUES('gateau','non');
        INSERT INTO miam VALUES('smoothie','non');
        INSERT INTO miam VALUES('gratin dauphinois','oui');
        COMMIT;
        $
  • # Un autre projet

    Posté par  (site web personnel) . Évalué à 10.

    Dans le cadre du travail, on transforme souvent des fichiers Excels venant des clients pour les adapter à nos structures de données. C’est un format assez pratique quand on n’a pas un public d’informaticien, le format de la donnée est stocké dans le fichier (contrairement au CSV), pas de problème d’encodage etc.

    Le problème arrive quand les données sont éclatées entre plusieurs fichiers qu’il faut assembler entre eux (à la manière d’une base de données avec plusieurs tables) : dans un fichier nous avons le code ISO du pays et son libellé français, dans un autre nous avons l’adresse avec le libellé français et il faut récupérer le code ISO.

    Avec une volumétrie de données très conséquentes, j’en étais arrivé à avoir des formules Excels qui deviennent incompréhensibles, sont sources d’erreur (le client renvoie une mise à jour du fichier avec 1200 lignes, mais les formules ne parcourent que les 1000 premières lignes), et mettent le PC à genou.

    Je me suis donc construit une application qui se charge d’appliquer des transformations sur des fichiers CSV ou XLSX, pour produire une sortie en CSV. L’application prend en paramètre un fichier de règle (qui décrit les liaisons entre plusieurs fichiers si nécessaire) :

    https://git.chimrod.com/importer.git/about/

    J’ai longtemps hésité à le publier (je l’ai fait comme un projet perso pour le travail), mais comme c’est également codé en OCaml est assez proche de ton domaine, je me permet de m’incruster :)

    • [^] # Re: Un autre projet

      Posté par  (site web personnel) . Évalué à 4.

      Ton outil est génial !! Il y a de grande chance que je l'utilise… Je vais étudier ça, car avant de générer du SQL, ce serait parfait !

      « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

      • [^] # Re: Un autre projet

        Posté par  . Évalué à 3.

        J'approuve, ça va m'être très utile aussi. Il manquerait un paramètre pour commencer à lire à partir d'une certaine ligne.

        • [^] # Re: Un autre projet

          Posté par  (site web personnel) . Évalué à 2.

          Faites-vous plaisir, et n’hésitez pas si vous voyez des retours !

          Je suis pas super à l’aise avec le packaging, mais je peux vous fournir des binaires pour debian ou windows. Vous pouvez m’écrire à "(Année en cours) + oon9chee@dailly.me" si besoin.

    • [^] # Re: Un autre projet

      Posté par  . Évalué à 4. Dernière modification le 16 mars 2024 à 23:13.

      En python pandas on peut fusionner des excels ou des csv et en faire ce qu'on veut ensuite (les injecter dans une base SQL, les exporter en un seul gros excel ou en csv…) en une ligne (sans compter les imports de bibliothèques) que je coupe en quatre lignes pour plus de lisibilité :

      import pandas as pd
      from pathlib import Path
      
      repertoire = Path("./repertoire_avec_les_csv")
      liste_fic = list(repertoire.glob('*.csv'))
      
      # on lit et on concatène tous les csv dans un dataframe
      df = pd.concat(map(lambda fic: pd.read_csv(fic, sep=";"), liste_fic))
      
      # on exporte où on veut
      df.to_excel("export.xlsx") # ou df.to_csv ou df.to_sql...

      Au chargement on peut remplacer les csv par des excels, ça marche exactement pareil (au nom des fonctions appelées près). On peut aussi faire des jointures entre csv et/ou excels (une fois ceux-ci chargés dans des dataframes), filtrer, convertir, etc… puis bien sûr ré-exporter.

    • [^] # Re: Un autre projet

      Posté par  . Évalué à 3.

      Cela me fait penser à un autre outil bien pratique présenté ici même : csvspoon.

  • # quand je dis "écris"

    Posté par  (site web personnel) . Évalué à 5.

    tu pourrais dire « écrit » (participe passé de écrire) :p

    au moins un LLM fait (un peu moins) de fautes d'accord :/ (sinon il aurait un peu de mal à te cracher un programme qui s'exécute /o\)

  • # C’est déjà géré en standard avec les principaux SGBD

    Posté par  (site web personnel, Mastodon) . Évalué à 9.

    La plupart des SGBD sont capables d’importer des CSV de façon native, avec une commande comme load data (Oracle, MySQL), copy (PostgreSQL), bulk insert (MSSQL), CSVREAD (H2), .import (SQlite), import (DB2)…

    La connaissance libre : https://zestedesavoir.com

    • [^] # Re: C’est déjà géré en standard avec les principaux SGBD

      Posté par  (site web personnel) . Évalué à 4. Dernière modification le 14 mars 2024 à 23:28.

      Alors pas exactement.

      Pour Copy en PostgreSQL par exemple, tu dois d'abord créer toi même la table, dans le bon ordre des champs, en déterminant toi-même les types des colonnes, et ensuite écrire toi même l'instruction COPY. J'en ai fait un paquet avant d'écrire cet outil pour justement éviter cela.

      « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

    • [^] # Re: C’est déjà géré en standard avec les principaux SGBD

      Posté par  (site web personnel) . Évalué à 3.

      Pour MariaDB, il faut créer la table soi-même et ensuite écrire la commande à la main.

      Apparemment, pas mieux pour MSSQL et Bulk Insert

      Pour H2, par contre, ça marche, mais il ne détecte pas le séparateur

      CREATE TABLE AREA AS
          SELECT * FROM CSVRead('/home/user/area.csv',
                                NULL,
                                'fieldSeparator=;') LIMIT 2;
      

      Je rappel l'objectif de mon outil :

      $ autocsv2sql fichier.csv | psql -h host -U user -d base
      

      « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

      • [^] # Re: C’est déjà géré en standard avec les principaux SGBD

        Posté par  (site web personnel, Mastodon) . Évalué à 5.

        Mais du coup, vraie question : quel est l’intérêt d’un outil qui tente de deviner le séparateur et le type des données ?

        Ça doit fonctionner avec des données en entrée bien maitrisées, mais dans le cas général c’est la garantie d’avoir du n’importe quoi importé dans tes bases, à cause d’erreurs de détection.

        La connaissance libre : https://zestedesavoir.com

        • [^] # Re: C’est déjà géré en standard avec les principaux SGBD

          Posté par  (site web personnel) . Évalué à 2.

          C'est vrai que cet outil ne garantie pas de gérer les CSV exotiques…

          Dans mon cas, j'ai par exemple pas mal de données issues d'OpenData publiques, genre INSEE, diverses institutions publiques nationales ou locales, etc. En générale les données sont proprement formatées, bien maîtrisées comme tu le dis. L'objectif est donc de pouvoir cibler ces données là en pouvant faire un

          for i in *.csv ; do autocsv2sql $i | psql ; done
          Une fois que j'ai tout téléchargé et dézipé.

          J'ai effectivement testé des CSV assez sales pour mes tests, et l'outil renvoi une erreur le plus souvent car il ne fonctionne que si le nombre de colonnes spécifié à la 1ière ligne est conforme au nombre de colonne sur toutes les lignes du fichier. En effet, je part du principe que la 1ière ligne est une ligne d'entête de colonne.

          Le plus souvent, je jette un œil sur les données avec less, je vérifie à l'oeil nu que les données sont propre et ensuite j'importe. Depuis 2 ans, je fais ça avec le clickodrome de DBeaver qui fait ça automatiquement, mais moins bien, il a en effet tendance à être optimiste sur la taille des varchar.

          « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

  • # Alternative

    Posté par  (site web personnel) . Évalué à 6.

    Si le but est juste de pouvoir faire des requêtes SQL sur les données, on peut aussi faire ça directement sur les fichiers CSV avec csvkit: https://csvkit.readthedocs.io/en/latest/scripts/csvsql.html

    C'est beaucoup plus lent qu'une vraie BD, mais c'est bien pratique sur des petits jeux de données.

    • [^] # Re: Alternative

      Posté par  (Mastodon) . Évalué à 6. Dernière modification le 14 mars 2024 à 13:57.

      Sérieusement à ce niveau là faut arrêter avec csv et utiliser sqlite directement!

      • [^] # Re: Alternative

        Posté par  (site web personnel, Mastodon) . Évalué à 4.

        Rien qu’avec des outils standards tels que awk, paste et column, on fait déjà pas mal de choses !

        • [^] # Re: Alternative

          Posté par  (Mastodon) . Évalué à 6. Dernière modification le 15 mars 2024 à 10:25.

          Plein d'erreurs par exemple.

          À moins que tes jeux de données ne comportent que des données numériques (et suivant la représentation tu vas t'emmerder), ton one-liner où ton script va se mettre en PLS au premier retour à la ligne dans une colonne, et c'est pas le genre de truc rare de nos jours.

          • [^] # Re: Alternative

            Posté par  . Évalué à 5.

            À moins que tes jeux de données ne comportent que des données numériques (et suivant la représentation tu vas t'emmerder), ton one-liner où ton script va se mettre en PLS au premier retour à la ligne dans une colonne, et c'est pas le genre de truc rare de nos jours.

            ouais, je plussoie vigoureusement. Le problème c'est pas tant de faire csv -> sql, c'est d'avoir des données correctes dans le csv.

            Genre: "plat, patate" en titre de colonne, et bimbamboum tout est pété car le nom de la colonne devient " patate" (eh ui, un espace ça casse tout après). Et je passe sur les blagues de "nom,prenom,ville" avec une ligne "octane,silicon graphics,"sous le bureau\nétage 2, batiment 5".

            Eh bin bon courage pour formatter ça proprement avant de le pipe dans un convertisseur de données :-(

            Un bon lien : https://sebsauvage.net/wiki/doku.php?id=csv

          • [^] # Re: Alternative

            Posté par  . Évalué à 3.

            c'est pas le genre de truc rare de nos jours

            Ça dépend vraiment du contexte. J'ai très rarement le cas perso (jamais en fait).

            Mais surtout, je fais du awk et autres binutils-rie en adhoc pas pour faire un outils réutilisable en aveugle. Donc si ça pose un problème (ne serais-ce qu'à cause d'unicode) je change d'outils. Selon l'humeur :
            - dans un tableur gnumeric ou LibO
            - avec python soit avec ipython soit, plus rarement, avec un notebook jupyter

            https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

            • [^] # Re: Alternative

              Posté par  (Mastodon) . Évalué à 3.

              Rien qu'à l'importation dans ton tableur, ça peut péter de la même manière. T'as meilleur temps d'importer une table dans libreoffice calc via libreoffice base connecté à une sgbd.

              Il y a moultes années comme jeune sysadmin j'étais aussi de ton avis mais l'expérience m'a montré que tu finis en général par passer plus de temps à debugger du parsing foireux qu'à manipuler directement les données en utilisant une base digne de ce nom.

              • [^] # Re: Alternative

                Posté par  . Évalué à 2.

                Merci pour ta condescendance, mais je ne vois pas en quoi LibO serait moins fiables que des programmes largement moins utilisés voir codé hier soir entre le fromage et le dessert. Si le csv n'est pas un csv valide, soit je ne l'utilise pas soit je ne considère pas comme un csv.

                T'as meilleur temps d'importer une table dans libreoffice calc via libreoffice base connecté à une sgbd.

                De ma petite expérience de perdreau naît à la dernière pluie, multiplier les importations diminue drastiquement la fiabilité de l'ensemble.

                https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

                • [^] # Re: Alternative

                  Posté par  (Mastodon) . Évalué à 2. Dernière modification le 15 mars 2024 à 16:35.

                  C'est pour ça que je préfère accéder à une base directement ou partir d'un dump plutôt que de jouer avec des exports csv dont la qualité est souvent incontrôlable.

                  Et si je pars de zero et veut créer mon propre jeu de données locales, au final ce n'est pas plus compliqué et plus fiable de partir sur du sqlite que du csv.

                  • [^] # Re: Alternative

                    Posté par  . Évalué à 3.

                    Je ne comprends pas de quoi tu parle. C'est une évidence qu'il faut partir du format le plus proche de la source et du mieux typé. Ça n'a aucun sens de partir d'un format complexe, l'exporter dans un format qui est très loin de l'expressivité de cette source pour ensuite le réimporter dans un autre outil quel-qu’il soit. Ce n'est pas une question d'importation réussi ou pas, même quand tu a réussi, tu as perdu beaucoup d'info.

                    https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

          • [^] # Re: Alternative

            Posté par  . Évalué à 2. Dernière modification le 16 mars 2024 à 23:10.

            Tututu, homme de peu de foi : GAWK supporte maintenant pleinement le CSV

        • [^] # Re: Alternative

          Posté par  . Évalué à 2.

          AWK mentioned 😎

          D'ailleurs la dernière version, toute fraîche de GAWK introduit l'option --csv pour parser du CSV en entrée.

          • [^] # Re: Alternative

            Posté par  . Évalué à 2.

            To be clear, gawk takes RFC 4180 as its specification for CSV input data. There are no mechanisms for accepting nonstandard CSV data, such as files that use a semicolon instead of a comma as the separator.

            C'est assez contraignant

            https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

            • [^] # Re: Alternative

              Posté par  . Évalué à 2.

              Ah oui, un peu ballot de pas pouvoir choisir le séparateur ; j'ai pas l'impression que ça coûterai grand chose

          • [^] # Re: Alternative : Attention au IO

            Posté par  . Évalué à 1.

            Merci pour les entrées sorties sur les disques si le volume de données est un peu important
            quelques centaines de méga.

            Le csv c'est pas la panacée c'est pour cela que lors de traitement d'import de données il faut très vite s'en débarasser 😎

  • # Visidata

    Posté par  . Évalué à 2.

    J'ai dans ma todo liste de regarder comment visidata, je l'avais découvert grâce à un journal ici https://linuxfr.org/users/steph1978/journaux/analyse-de-donnees-avec-duckdb

    https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

    • [^] # Re: Visidata

      Posté par  (site web personnel) . Évalué à 2.

      Super outil, mais encore une fois, j'ai eu trop de déboires avec python, à cause de librairies cassées, j'ai eu des outils super et au bout de 6 mois tu te retrouve à galérer des heures parce qu'il ne marche plus :(

      « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

      • [^] # Re: Visidata

        Posté par  . Évalué à 3.

        Il est dans le dépôt de ma distribution donc ça me pose pas de problème, mais je comprends.

        https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

      • [^] # Re: Visidata

        Posté par  . Évalué à 3.

        J'avais fait un snippet qui permet de le compiler en executable standalone. C'est moins sensibles au environnements mouvants.

        D'ailleurs je n'installe aucune bibliothèques Python dans l'environnement système. J'utilise asdf et le Virtual Env.

  • # python bashing mal placé

    Posté par  . Évalué à 4.

    ça ne se met pas à tomber en panne 6 mois plus tard parce que la lib pymachin est passée de la 3.1.6 à la 3.1.7

    Lorsqu'on emploie ce type d'argument contre python, c'est qu'on ne connaît simplement pas l'outillage qui va avec ; il y a un packager d'exe, plusieurs, en fait.

    Juste dire "c'est trop lent" (avec modération, car faut bencher pour dire ça) ou "j'aime pas la syntaxe" ou "je voulais faire du OCaml".

  • # ETL

    Posté par  (site web personnel) . Évalué à 2.

    Hello à tous,

    Pas mal tout ces outils en CLI que je garde sous la main pour des usages en oneshot.

    Lorsque l'opération revient régulièrement je suis passé sur un ETL (Talend Open Studio). Il y a une phase d'apprentissage qui n'est pas négligeable mais en gros il est possible de prendre X sources différentes et de pousser l'ensemble dans X destinations, de faire de la manipulation de données au milieu, d'avoir des alertes et le plus intéressant : rendre les jobs "batchable". Très pratique pour synchroniser des données régulièrement.

    Je cite Talend car je connais que celui-ci en "presque" open source, mais je veux bien changer pour un vrai open source ;)

    Born to Kill EndUser !

    • [^] # Re: ETL

      Posté par  . Évalué à 2.

      Moi j'aime bien Benthos. C'est intermédiaire entre en simple script et une ETL avec studio de dev.

      • [^] # Re: ETL

        Posté par  (site web personnel) . Évalué à 2.

        En ETL libre tu as Pentaho en version CE, ya pas mal d'open-core mais bon… Mais, oui, Talend est un bon choix même si avec le rachat par Qlik faudra voir.

        Un collègue avait utilisé SQLdeveloper début 2000 (le machin client lourd de Microsoft, sans aller jusque SSIS/SSAS) avant son renommage en PowerBI, l'intérêt c'est que ça faisait le mapping à la volée sur les données à migrer (notamment pour les dates, mais aussi pour les transcriptions de libellé / agrégations de champ comme nom+prénom => nom_prenom…).

        Tu as une bonne vision du domaine avec : https://www.datacamp.com/blog/a-list-of-the-16-best-etl-tools-and-why-to-choose-them
        (en gros Informatica et Datastage qui coûtent une blinde voire un bras et parfois un rein :/) et 2-3 solutions un peu plus libres (faut creuser côté community edition, comme d'hab').

        il y a peut-être https://www.g2.com/categories/etl-tools à creuser… (plusieurs pages de tout venant…)

        Bref, tant que tu as les connecteurs in/out et que tu peux travailler à la volée — puis valider selon ces mêmes règles ultérieurement — ça le fait

      • [^] # Re: ETL

        Posté par  (site web personnel) . Évalué à 2. Dernière modification le 05 avril 2024 à 01:48.

        hmmm Benthos o_O sympa leur site, ça donne entièrement confiance

        # Install
        curl -Lsf https://www.benthos.dev/sh/install | bash

        hop, poubelle jusque trouver un git avec README.md (ou mieux un /doc) et des issues / faq identifiant des exemples d'utilisation

        • [^] # Re: ETL

          Posté par  . Évalué à 3.

          curl -Lsf https://www.benthos.dev/sh/install | bash

          C'est une mauvaise habitude qui se répand…

          Mais on peut toujours lire le contenu du script au lieu de l'exécuter aveuglément.
          Dans la majorité des cas, ça se content de détecter l'os et le type de cpu pour DL le bon binaire dans la release GH. Ce qui peut être fait à la main.

          Mais en y réfléchissant si tu fais suffisamment confiance aux dev pour installer le gros binaire, pourquoi ne pas avoir confiance dans leur script d'install ?

          • [^] # Re: ETL

            Posté par  (site web personnel) . Évalué à 2.

            Tkt, si ya un loup c'est dans le m4, pas dans le shell.

            Adhérer à l'April, ça vous tente ?

          • [^] # Re: ETL

            Posté par  (site web personnel) . Évalué à 1. Dernière modification le 05 avril 2024 à 21:29.

            Mais en y réfléchissant

            c'est désobéir :p

            si tu fais suffisamment confiance aux dev pour installer le gros binaire, pourquoi ne pas avoir confiance dans leur script d'install ?

            je ne sais pas, je ne connais pas MITM c'est une série — avec un certain Malcom< — que je n'ai pas vue ;-)

            Mais on peut toujours lire le contenu du script au lieu de l'exécuter aveuglément.

            tu as un wireshark en permanence pour regarder ton trafic réseau ?

            Dans la majorité des cas, ça se content de détecter l'os et le type de cpu pour DL le bon binaire dans la release GH. Ce qui peut être fait à la main.

            GH ?
            je connais GA pour General Availability mais GH…
            et depuis mon passage dans les Telcos — même si les acronymes font partie de mon vocabulaire — je les utilise peu ; après traductions classiques je puis ajouter acronymes :D

            • [^] # Re: ETL

              Posté par  . Évalué à 2. Dernière modification le 07 avril 2024 à 10:11.

              Mais on peut toujours lire le contenu du script au lieu de l'exécuter aveuglément.

              tu as un wireshark en permanence pour regarder ton trafic réseau ?

              Le mot important était "au lieu de".

              ajouter acronymes :D

              voici qui est fait. ajouté ici aussi.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.