Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Lire un fichier CSV avec DuckDB

Après cette leçon: Je peux interroger un fichier CSV par son nom, comme s'il s'agissait d'une table.

Leçon de 50 minAucune commande

Interroger un fichier CSV comme une table

DuckDB sait lire un fichier CSV directement : on écrit son nom après from, sans l'importer d'abord. Le fichier joue le rôle d'une table pendant la requête.

Un club de location de vélos exporte chaque semaine ses trajets dans un fichier. Un étudiant veut la durée moyenne par station, tout de suite.

À la fin de cette leçon

Remarque

Je peux interroger un fichier CSV par son nom, comme s'il s'agissait d'une table.

Mots clés

MotCe que ça veut direExemple
CSVun fichier texte où une ligne est une ligne de données, séparée par des virgules
En-têtela première ligne, qui donne le nom des colonnes
Typela nature d'une colonne : entier, texte, dateBIGINT
read_csvla fonction qui lit un fichier CSV comme une table
Bac à sablela page du site où vous essayez du code et déposez votre fichier

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Un CSV est du texte en colonnes

Dans un CSV, chaque ligne du fichier est une ligne de données. Une virgule sépare les valeurs. La première ligne, l'en-tête, donne le nom des colonnes.

C'est le format d'échange le plus courant : tableur, application, capteur, tous savent en écrire un. Voici le contenu du fichier trajets.csv du club.

Exemple : le contenu du fichier trajets.csv

idstation_departstation_arriveeduree_minjourcode_postal
1GareUniversite122026-09-0106000
2GareMarche72026-09-0106000
3UniversiteGare132026-09-0206100
4MarcheUniversite92026-09-0206100
5GareUniversite112026-09-0306000
6MarcheGare82026-09-0306200

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

FROM suivi d'un nom lit le fichier

read_csv('trajets.csv') donne une table dont les colonnes viennent du fichier. On peut l'interroger comme une autre : select, where, group by.

Écrire seulement from 'trajets.csv' marche aussi. Les fichiers TSV (tabulations) et JSON en lignes se lisent de la même façon.

Exemple : la durée moyenne par station

Code: duckdb
-- Dans le bac à sable, avec trajets.csv déposé : le fichier est la table.
select station_depart, count(*) as nb, round(avg(duree_min), 1) as duree_moyenne
from read_csv('trajets.csv')
group by station_depart
order by station_depart;

Où cela fonctionne ici

Important

Lire un fichier par son nom marche dans le bac à sable de DuckDB. Vous y déposez un fichier de texte : CSV, TSV ou JSON en lignes, 64 Ko au plus. Le Parquet n'est pas pris en charge. Les blocs de cette leçon n'ont pas de fichier : ils lisent une table construite pour lui ressembler.

DuckDB devine le type de chaque colonne

Les noms viennent de l'en-tête. Les types sont devinés en lisant les premières lignes : des entiers, du texte, des dates.

Avec describe select * from read_csv('trajets.csv'), DuckDB affiche les types devinés. Voici ce qu'il a affiché pour notre fichier.

Exemple : les types que DuckDB devine

ColonneExemple de valeurType deviné
id3BIGINT
station_departGareVARCHAR
duree_min12BIGINT
jour2026-09-01DATE
code_postal06000VARCHAR

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

S'entraîner avec une table qui ressemble au fichier

Pour s'entraîner sans fichier, on crée une table avec les mêmes colonnes et les mêmes types. La requête ne change que d'un mot : from trajets remplace from read_csv('trajets.csv').

C'est aussi ainsi qu'on vérifie une requête avant de la lancer sur un gros fichier.

À vous : la même requête sur une table

Code: duckdb
-- Même requête que pour le fichier, mais sur une table qui lui ressemble.
select station_depart, count(*) as nb, round(avg(duree_min), 1) as duree_moyenne
from trajets
group by station_depart
order by station_depart;
-- Ajoutez where duree_min >= 9 avant group by : quelles stations perdent des trajets ?

On peut corriger la lecture avec des options

Sans en-tête, écrivez header = false : les colonnes s'appellent column0, column1, et ainsi de suite.

Pour imposer un type, écrivez types = {'code_postal': 'INTEGER'}. Attention : un code postal 06000 devient alors l'entier 6000, et le zéro du début disparaît.

Exemple : deux options de read_csv

Code: duckdb
-- Un fichier sans ligne d'en-tête : les colonnes s'appellent column0, column1, ...
select * from read_csv('trajets.csv', header = false, skip = 1);

-- Forcer un type : ici le code postal devient un entier.
select * from read_csv('trajets.csv', types = {'code_postal': 'INTEGER'});

Une erreur fréquente

Attention

Beaucoup pensent que read_csv range le fichier dans la base. Ce n'est pas le cas : le fichier est relu à chaque requête, et rien n'est stocké. Si le fichier change entre deux requêtes, le résultat change aussi.

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.