Aller au contenu

Éditer avec le CRUD

Les commandes CRUD traitent un flux GTFS comme une petite base relationnelle. Ce guide déroule un scénario réaliste : renommer un arrêt, corriger une ligne mal classée, retirer une ligne obsolète — tout en gardant le flux valide à chaque étape.

L’exemple utilise un flux gtfs.zip dans le répertoire courant. Remplacez par votre propre chemin au fil de la lecture.

Vous maintenez un flux de transport avec des dizaines de milliers d’arrêts. Un audit récent a signalé trois points à corriger :

  1. L’arrêt S01 doit être renommé de “Place” à “Gare Centrale”.
  2. Une ligne de bus est mal encodée en route_type=700 (cable tram) et doit passer à 3 (bus).
  3. Une ancienne ligne OLD_LINE est mise au rebut — tous les trajets, et les lignes qui les référencent, doivent être retirés.

Ne modifiez jamais ce que vous n’avez pas d’abord vérifié. La commande read est en lecture seule et prend la même clause --where que update et delete.

Fenêtre de terminal
gapline read stops -f gtfs.zip --where "stop_id=S01"

La sortie confirme exactement une ligne, avec les champs attendus :

stop_id | stop_name | stop_lat | stop_lon | ...
S01 | Place | 45.5017 | -73.5673 | ...

Si le match est plus large que prévu, resserrez le filtre :

Fenêtre de terminal
gapline read stops -f gtfs.zip --where "stop_name LIKE Place%" | wc -l

Réécriture de champ simple — stop_name n’est pas une clé primaire, donc pas de cascade.

Fenêtre de terminal
gapline update stops -f gtfs.zip \
--where "stop_id=S01" \
--set stop_name="Gare Centrale" \
--confirm

Relire pour confirmer :

Fenêtre de terminal
gapline read stops -f gtfs.zip --where "stop_id=S01"

Même forme — mise à jour mono-champ, pas de PK. Le --where capte toute ligne au mauvais type, qu’il y en ait une ou plusieurs.

Fenêtre de terminal
gapline update routes -f gtfs.zip \
--where "route_type=700" \
--set route_type=3 \
--confirm

Si l’exécution retourne “NO_CHANGES” (code de retour 4), rien n’a matché — la correction avait déjà été appliquée dans une passe précédente.

C’est l’étape risquée. Retirer un route_id implique que tous les trajets associés disparaissent, et que toutes les lignes stop_times qui référencent ces trajets disparaissent aussi. gapline calcule cette chaîne automatiquement.

  1. Prévisualiser la zone d’impact — lecture seule, pas de surprise :

    Fenêtre de terminal
    gapline read trips -f gtfs.zip --where "route_id=OLD_LINE" | wc -l
  2. Supprimer les trajets — l’aperçu de cascade liste chaque fichier dépendant qui perdra des lignes :

    Fenêtre de terminal
    gapline delete trips -f gtfs.zip --where "route_id=OLD_LINE"
    Records to delete from trips.txt:
    OLD_LINE-T01
    OLD_LINE-T02
    ... and 47 more
    Deleting would also delete:
    - 1 243 records in stop_times.txt
    - 12 records in frequencies.txt
    Proceed with cascade delete? [y/N] y
  3. Retirer la ligne elle-même — elle n’a plus de trajets qui la référencent, donc pas de cascade :

    Fenêtre de terminal
    gapline delete routes -f gtfs.zip --where "route_id=OLD_LINE" --confirm

Avant de livrer le flux modifié, lancez la validation complète pour confirmer que rien n’a glissé :

Fenêtre de terminal
gapline validate -f gtfs.zip --min-severity warning

Si vous voulez un fichier de sortie séparé, ajoutez --output gtfs-patched.zip au dernier update/delete ou passez-le à un script .gl. Voir écrire des scripts .gl pour une version de ce scénario en un seul batch qui garde le flux source intact jusqu’au succès du save.

IntentionCommande
Voir ce qui sera impacté.gapline read <target> --where "…"
Modifier un champ (non-PK).gapline update <target> --where "…" --set field=value --confirm
Renommer une clé primaire dans tout le flux.gapline update <target> --where "…" --set id=new_id --cascade --confirm
Retirer des enregistrements et leurs dépendants.gapline delete <target> --where "…" (aperçu) ou … --confirm (auto-oui)
Écrire vers un nouveau fichier.Ajoutez -o newfeed.zip à n’importe laquelle des commandes ci-dessus.