deblan.io-gemini/blog/posts/578.gmi

54 lines
2.5 KiB
Plaintext
Raw Normal View History

2020-12-18 11:57:17 +01:00
# Analyser efficacement un fichier CSV
* 2020-02-20 15:17:02
* Développement
2021-04-09 15:46:35 +02:00
Je travaille régulièrement sur des traitements de fichiers CSV. J'apprécie beaucoup ce format de fichier car il se génère et se lit facilement, qu'on soit informaticien ou non. J'ai d'ailleur écrit 2 librairies PHP pour lire, générer et valider des CSV :
=> https://gitnet.fr/deblan/csv deblan/csv
et
=> https://gitnet.fr/deblan/csv-validator deblan/csv-validator
.
2020-12-18 11:57:17 +01:00
2021-04-09 15:46:35 +02:00
Lors des mes analyses, je me confronte parfois à des fichiers qui comportent beaucoup de colonnes et c'est un enfer d'utiliser un tableur pour visualiser et filtrer ces tableaux très larges.
2020-12-18 11:57:17 +01:00
2021-04-09 15:46:35 +02:00
Après quelques recherches, j'ai découvert deux projets qui se complètent à merveille ! Le premier est un outil qui transforme un fichier CSV en une base de données SQLite :
=> https://pypi.org/project/csvs-to-sqlite/ csvs-to-sqlite
. Le second génère une interface web (avec un serveur web intégré) pour faire des requêtes SQL sur une base de données SQLite :
=> https://pypi.org/project/datasette/ datasette
.
2020-12-18 11:57:17 +01:00
2021-04-09 15:46:35 +02:00
Ce sont des outils écrits en Python qui s'installent et s'utilisent en une poignée de secondes.
2020-12-18 11:57:17 +01:00
2021-04-09 15:46:35 +02:00
```{.language-bash data-title="Installation"}
$ sudo pip3 install csvs-to-sqlite datasette
2020-12-18 11:57:17 +01:00
```
2021-04-09 15:46:35 +02:00
Pour illustrer, je vais traiter le fichier CSV de la base officielle des codes postaux disponible sur
=> https://www.data.gouv.fr/fr/datasets/base-officielle-des-codes-postaux/ data.gouv.fr
.
2020-12-18 11:57:17 +01:00
2021-04-09 15:46:35 +02:00
```{.language-bash data-title="Installation"}
$ wget -O codes_postaux.csv https://datanova.legroupe.laposte.fr/explore/dataset/laposte_hexasmal/download/\?format\=csv\&timezone\=Europe/Berlin\&use_labels_for_header\=true
2020-12-18 11:57:17 +01:00
$ csvs-to-sqlite -s ";" codes_postaux.csv codes_postaux.db
$ datasette serve codes_postaux.db
Serve! files=('codes_postaux.db',) (immutables=()) on port 8001
INFO: Started server process [8550]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8001 (Press CTRL+C to quit)
```
2021-04-09 15:46:35 +02:00
On peut maintenant accéder à
=> http://127.0.0.1:8001
depuis un navigateur et commencer à analyer et traiter les données :
2020-12-18 11:57:17 +01:00
2021-04-09 15:46:35 +02:00
=> https://upload.deblan.org/u/2020-02/5e4e93b5.png datasette [IMG]
2020-12-18 11:57:17 +01:00
2021-04-09 15:46:35 +02:00
Et le plus intéressant pour moi, c'est de pouvoir écrire des requêtes SQL affiner vraiment les données affichées :
2020-12-18 11:57:17 +01:00
2021-04-09 15:46:35 +02:00
=> https://upload.deblan.org/u/2020-02/5e4e93c1.png datasette [IMG]
2020-12-18 11:57:17 +01:00
2021-04-09 15:46:35 +02:00
Enfin, on peut générer un nouveau fichier CSV (ou JSON) avec les données filtrées.
2020-12-18 11:57:17 +01:00
2021-04-09 15:46:35 +02:00
Simple, rapide et efficace !