Il y a quelque temps, j'ai contacté la Communauté de Commune de la Vallée de Clisson sur sa page Facebook pour tenter d'obtenir un fichier csv contenant les dates de ramassage des déchets par zone géographique.
Mon constat était que :
- Le calendrier papier n'est pas très facile à lire.
- Si je parviens à le lire, j'ai aussi de bonnes chances d'oublier de sortir les poubelles le jour J, surtout lorsque le ramassage est 1 semaine sur 2.
- Entrer manuellement les dates de ramassage dans un agenda informatique est vraiment fastidieux.
- Il est probable que je ne sois pas le seul dans cette situation.
J'ai reçu ce fichier il y quelques jours. Voyons ce que je peux en faire.
En voici un extrait :
title;short;datetime;category;tx_newscalendar_state Aigrefeuille-sur-Maine bourg;OM;1420416000;148;1 Aigrefeuille-sur-Maine bourg;OM;1420675200;148;1 Aigrefeuille-sur-Maine bourg;OM;1421280000;148;1 Aigrefeuille-sur-Maine bourg;OM;1421884800;148;1
Nous avons donc une première ligne d'en-tête, puis les données avec dans l'ordre la zone, le type de ramassage, une date sous forme de "timestamp", un identifiant de zone, et une valeur inutile (elle est la même pour toutes les lignes).
La première transformation à faire est sur le timestamp, qui indique le nombre de secondes entre le 1er janvier 1970 et la date voulue. Un petit tour dans un tableur pour utiliser la formule ci-dessous (ici dans Excel)
Pour la suite, plutôt que de continuer à utiliser un tableur, j'ai choisi d'essayer un outil dont j'avais entendu parler sur le site de Korben : Open Refine. Il s'agit d'un programme qui ressemble à un tableur, qui a quelques fonctions proches d'un tableur, mais qui est spécialisé dans le traitement de données hétérogènes.
En utilisant des filtres, des regroupements automatiques (nommés "Facet"), je vois très vite qu'il y a 29 zones différentes, et qu'il manque un identifiant pour "Gorges côté Caillerie" :
Un petit tour sur le calendrier en ligne et je retrouve l'id manquant (225) dans l'adresse de la page web lorsque je choisis le secteur de Gorges qui m'intéresse.
J'en profite pour redonner un peu d'uniformité en remplaçant les quelques noms de communes incomplets comme "Aigrefeuille" par "Aigrefeuille-sur-Maine", les OM par "Bac gris" et "tri" par "Sacs jaunes" que je trouve un peu plus parlants. Je termine en renommant les colonnes pour correspondre à ce que le service Google Agenda réclame durant l'import de fichier csv.
Ensuite, on exporte, et voici le résultat : Collecte déchets CCVC export Open Refine
L'étape suivante, est de séparer ce fichier par zone de ramassage pour pouvoir ensuite créer son propre calendrier. Et là, lecteur, je dois t'avouer que j'y ai passé beaucoup de temps avant de trouver une solution convenable. Bien entendu, j'aurai pu patiemment exporter à la main les différentes zones vers un fichier séparé, mais c'est ennuyant, et contraire à l'idée de manipuler les données de manière automatique. Oui, exporter 29 fichiers, c'est réalisable en quelques minutes, mais si j'avais plusieurs centaines de zones différentes ? Non merci, sans moi !
J'ai commencé par utiliser l'outil en ligne de commande CSVFix et la fonction "file_split" :
csvfix file_split -f 2 -fd "c:\Users\stemani\Documents\collecte dechet clisson csv\export" -ufn "collecte-2015v2 export OpenRefine.csv"
J'ai bien obtenu un fichier par zone, mais pour chacun d'entre eu, j'ai perdu l'entête, et c'est là que ça c'est gâté car je n'ai pas trouvé de solution simple pour réintégrer cette première ligne, la commande ci-dessous (dans Powershell) me retournant systématiquement un fichier ne contenant que l'en-tête :
csvfix echo -smq -hdr "zone,location,subject,start date" '.\file_Boussay bourg.csv' | Out-File -filepath '.\file_Boussay bourg.csv'
Bizarrement, la même ligne de commande avec pour sortie un autre fichier fonctionne correctement. Bien qu'il y ait certainement une explication toute simple, mon niveau en script est trop faible, ça reste un mystère non résolu pour le moment.
En revanche, j'ai trouvé ici une autre solution utilisant uniquement les fonctions intégrées au Powershell, et c'est bien plus efficace puisqu'en une seule passe j'obtiens le résultat désiré, la fonction Export-Csv ayant la bonne idée de conserver l'en-tête :
Import-Csv '.\collecte-2015v2 export OpenRefine.csv' | Group-Object -Property "location" | Foreach-Object {$path=".\export\"+$_.name+".csv" ; $_.group | Export-Csv -Encoding UTF8 -Path $path -NoTypeInformation}
La prochaine étape, et l'objet du prochain article, sera d'importer ces fichiers dans un agenda, mais en attendant, tu peux télécharger le résultat :
Collecte déchets CCVC - 1 fichier par zone