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 octane . É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):
Après, il faut que le fichier soit bien formatté, ce genre de truc, mais c'est vraiment bien :-)$ 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
$
[^] # Re: sqlite? mysql?
Posté par Ontologia (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 octane . Évalué à 10.
# Un autre projet
Posté par chimrod (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 Ontologia (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 orfenor . É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 chimrod (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 pas_pey . É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é :
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 gogonono . Évalué à 3.
Cela me fait penser à un autre outil bien pratique présenté ici même : csvspoon.
# quand je dis "écris"
Posté par BAud (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\)
[^] # Re: quand je dis "écris"
Posté par Ontologia (site web personnel) . Évalué à 5.
Mon orthographe deviens une catastrophe, sans doute parce que je lis beaucoup moins. L'habitude de regarder des vidéos, de moins passer de temps à lire des livres, c'est terrible…
Falloir que je me rachète un bécherelle…
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker
[^] # Re: quand je dis "écris"
Posté par sebas . Évalué à 4.
… ou alors regarder un flim éducatif :
https://invidious.privacydev.net/watch?v=kI8zjPjXAiY (1 minute)
# C’est déjà géré en standard avec les principaux SGBD
Posté par SpaceFox (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 Ontologia (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 Ontologia (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
Je rappel l'objectif de mon outil :
« 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 SpaceFox (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 Ontologia (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
Une fois que j'ai tout téléchargé et dézipé.for i in *.csv ; do autocsv2sql $i | psql ; done
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 Matthieu Moy (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 Psychofox (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 Thierry Thomas (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 Psychofox (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 octane . Évalué à 5.
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 barmic 🦦 . Évalué à 3.
Ç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 Psychofox (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 barmic 🦦 . É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.
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 Psychofox (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 barmic 🦦 . É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 steph1978 . É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 Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 3.
Je présume que ça reporte les dernières corrections et ajouts de Kernighan :) Après, le problème va être que les parcs soient mis à jour (je rencontre encore pas mal d’infra avec des dinosaures.)
“It is seldom that liberty of any kind is lost all at once.” ― David Hume
[^] # Re: Alternative
Posté par steph1978 . É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 barmic 🦦 . Évalué à 2.
C'est assez contraignant
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: Alternative
Posté par steph1978 . É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 Nodeus . É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 barmic 🦦 . É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 Ontologia (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 barmic 🦦 . É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 steph1978 . É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 steph1978 . Évalué à 4.
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 Philippe M (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 steph1978 . É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 BAud (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 BAud (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
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 steph1978 . Évalué à 3.
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 Pol' uX (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 BAud (site web personnel) . Évalué à 1. Dernière modification le 05 avril 2024 à 21:29.
c'est désobéir :p
je ne sais pas, je ne connais pas MITM c'est une série — avec un certain Malcom< — que je n'ai pas vue ;-)
tu as un wireshark en permanence pour regarder ton trafic réseau ?
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 steph1978 . Évalué à 2. Dernière modification le 07 avril 2024 à 10:11.
Le mot important était "au lieu de".
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.