[R] Demande d'orientation

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Ric
Niveau 1
Niveau 1
Messages : 9
Enregistré le : ven. 15 août 2014 20:04
Status : Hors ligne

[R] Demande d'orientation

#1

Message par Ric »

Bonsoir à tous,

Je viens requérir les conseils de quelques experts. Je ne suis pas un grand habitué d'AutoIt ; je ne m'en sers que très ponctuellement pour des usages bien précis. Pour ce que j'ai à réaliser, j'ai essayé diverses choses, mais je crains de ne trop m'égarer et de perdre trop de temps que je n'ai pas. Alors je vous sollicite pour obtenir une orientation pour voir comment m'y prendre.

Finalité : il s'agit de traiter du fichier CSV.

Commentaires sur les fichiers CSV sources :
  • Ils proviennent probablement de Excel, et leur délimiteur sera toujours ;
  • Ils contiennent un nombre aléatoires de lignes (de ce que j'ai constaté, d'une dizaine à quelques centaines)
  • Ils contiennent toujours le même nombre de colonnes, chacune étant toujours formaté de la même façon, mais bémol pas toujours dans le même ordre (même si 99% le sont).
  • La première ligne contient le nom des colonnes. Les noms de ces colonnes sont toujours les mêmes (mais leur agencement peut varier comme dit juste avant)
  • Un fichier joint est donné à titre d'exemple de fichiers sources.
Choses qu'il me faudrait réaliser :

1- sans interactions particulières et sans nécessité d'affichage des données :
  • Identifier l'ordre des colonnes via des recherches de texte pour insérer leur numéros en variables ? (dans l'idée de pouvoir traiter indiféremment les fichiers qui ne sont pas ordonnés de la même façon.)
  • Des colonnes ne seront jamais exploitées, il faudrait pouvoir les supprimer automatiquement sans interactions.
  • Il faudrait pouvoir supprimer des lignes complètes en fonction du contenu de certains champs : dans le fichier d'exemple CSV, vous noterez que du titre 24 au titre 48, il y a des 'Oui' et des 'Non'. Ainsi, certaines lignes comportant certains champs à 'Nom' seraient supprimées sans plus de traitement.
  • insérer une nouvelle colonne avec, pour chacune des lignes, un identifiant 'maison' sous forme de texte en fonction de la valeur d'un autre champ (chiffre) de la ligne
2-Sur ce premier traitement automatique, deux issues optionnelles laissées à l'utilisateur :
  • une exportation du fichier réordonné dans un ordre de colonnes donné, sans toutes les insérer toutes fois, dans un nouveau fichier CSV propre.
  • un affichage écran de certains champs de certaines lignes, avec possiblité de faire défiler ces mêmes champs d'une ligne à l'autre (dans une optique d'aide visuelle à la saisie sur un outil tiers).
C'est un peu confus sans doute, si c'est le cas je vous prie de m'en excuser.

Une fois tout cela exposé, c'est là que je sollicite une 'grande orientation' : me recommanderiez-vous de partir sur du traitement avec une UDF dédiée au CSV (j'en ai croisé plusieurs, de différentes versions, avec parfois quelques fonctionnalités qui me seraient utiles, d'autres pas du tout), ne traiter les choses qu'en jonglant avec les _Array, envisager peut-être du sqlite, ou encore autre chose que je n'aurais pas du tout évoqué ?

Merci d'avoir jeté un coup d’œil.
Fichiers joints

[L’extension csv a été désactivée et ne peut plus être affichée.]

Modifié en dernier par Ric le dim. 17 août 2014 17:41, modifié 1 fois.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Demande d'orientation

#2

Message par jguinch »

Bonjour Ric, bienvenue sur notre forum.
Pas facile de donner des recommandations... Perso, je dirais que chacun fait un peu comme il veut, en fonction de son niveau.

Tu peux faire de la lecture ligne à ligne (FileReadLine), éclater chaque ligne dans un tableau (StringSplit) et écrire uniquement les lignes voulues dans un fichier CSV de sortie.
Pour supprimer des colonnes, il suffit simplement de ne pas les écrire dans le fichier de sortie.
Ne pas oublier un petit fichier de log, qui permettra de tracer les éventuelles erreurs.

Un petit exemple simple :
► Afficher le texte
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Faco
Niveau 4
Niveau 4
Messages : 80
Enregistré le : lun. 29 juil. 2013 18:09
Status : Hors ligne

Re: [..] Demande d'orientation

#3

Message par Faco »

Salut,

j'ai pas testé et j'ai pas géré les erreurs, mais sinon ça devrais le faire ;) : (moi aussi je suis parti sur de l'array)
► Afficher le texte
Modifié en dernier par Faco le sam. 16 août 2014 00:42, modifié 1 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Demande d'orientation

#4

Message par mikell »

Faco, et la balise "code" ? :evil:

Sinon comme dit jguinch, il y a plein de solutions
Quelques centaines de lignes, c'est très peu, ça peut être géré avec des fonctions custom réalisées sur la base des fonctions _FileReadToArray et _Array* (_ArrayDelete, _ArrayInsert, _ArrayColDelete, _ArrayColInsert, etc)
S'il doit y avoir beaucoup de manipulations plus ou moins pointues sqlite est précis, solide et performant mais un peu plus délicat à coder
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Faco
Niveau 4
Niveau 4
Messages : 80
Enregistré le : lun. 29 juil. 2013 18:09
Status : Hors ligne

Re: [..] Demande d'orientation

#5

Message par Faco »

la fatigue...
la dernière fois on m'a dit de mettre mon code dans un spoil parce-qu’il était un peu long, moi je suis pas embêtant, balise spoil.

il est tard, va dormir mikell :P
(t’embête pas à expliqué j'ai saisi ;) )
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Demande d'orientation

#6

Message par orax »

► Afficher le textevoir un autre exemple →
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Ric
Niveau 1
Niveau 1
Messages : 9
Enregistré le : ven. 15 août 2014 20:04
Status : Hors ligne

Re: [..] Demande d'orientation

#7

Message par Ric »

Bonjour :)

Vous m'avez gâté, je ne voulais pas vous ennuyer autant. J'étais venu solliciter une grande ligne à suivre et vous m'avez fait plein d'exemples à piocher ! Merci. Je vais donc procéder à quelques essais et tester tout ça, voir ce qu'il m'est plus facile d'assimiler et d'intégrer.

Avant vos réponses, j'avais vu aussi l'UDF de Tlem qui pouvait peut-être m'être intéressant. Je mets surtout le lien dans le sujet pour pouvoir le retrouver facilement plus tard (ou un lecteur).

Pour l'insertion de l'information supplémentaire, via l'ajout d'une colonne : insérer une nouvelle colonne avec, pour chacune des lignes, un identifiant 'maison' sous forme de texte en fonction de la valeur d'un autre champ (chiffre) de la ligne. Concrètement, pour partir du fichier source exemple, en 'Titre 11' les données-exemples 12345 correspondent en fait à des codes postaux. En fonction de celui-ci, un identifiant unique serait inséré en fin de ligne (via l'ajout d'une nouvelle colonne).

Ma base de correspondances (bête tableur Excel en l'état) ne contient heureusement pas les 36000 et quelques communes françaises :p Mais j'en ai quand même presque 14000 correspondances (sachant qu'une commune a plusieurs codes postaux). Toutes les correspondances ne sont visiblement pas nécessaires : je dois pouvoir limiter à une centaine en faisant des encadrements de valeurs (exemple, de 21000 à 21999 correspond tel champ texte), avec parfois un ou deux cas particuliers qui obligeraient à sous-diviser un encadrement.

Je souhaitais l'insertion auto de l'identifiant en fin de ligne, sans appel extérieur du script (il faudrait les données insérées sous une forme dans le script) : l'outil sera exécuté sur des environnements qui ne sont pas en réseau, avec une gestion stricte des droits. Pour cette raison, je voulais inclure cette correspondance dans le script, quitte à ce que cela le rende de fait plus volumineux.

J'avais imaginé peut-être un CSV dédié inclus (ce qui ferait déjà 800 et quelques Ko), peut-être extrait à l'exécution du script, une boucle de recherche de correspondance, et une suppression à la sortie du script ; qu'en pensez-vous ?

Merci à tous les 4 (jguinch, Faco, mikell, orax) de votre coup d’œil en tous les cas. Je crois que je vais gagner beaucoup de temps, je me dispersais à essayer plein de petites choses qui auraient été laborieuses à accorder ensuite.

Edit : merci du message de bienvenue également :) J'étais inscrit il y a quelques années, mais je ne sais plus sous quel couple pseudo/mail, je ne l'ai pas retrouvé :/
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Demande d'orientation

#8

Message par jchd »

Concernant les codes postaux, je peux te fournir des données plus complètes (62015 CP français validés dont 22169 cedex, 10 air, 458 armées, 12 spéciaux et [seulement] 2 cityssimo). Je peux déjà te dire que dénicher le bon code postal ou plutôt la liste des codes postaux possibles pour un nom de commune donné est tout sauf un problème simple, vraiment.

Toutes les listes de codes postaux français (pour rester simple) disponibles gratuitement sont truffées d'erreurs et d'omissions. De nombreux noms de communes sont ambigüs (homonymie exacte, comme Bordeaux 33x00 et 77410). L'orthographe des communes s'accompagne presque toujours d'un flou parfois très artistique, outre la gestion de la désaccentuation et des abbréviations. Le regroupement de communes rend la chose bien plus sportive encore.

A ce tableau alarmant il faut rajouter la faculté d'insérer de nouveaux codes postaux certifiés valides rencontrés en cours d'exploitation.

Jusqu'à présent je me suis abstenu de proposer une solution SQLite (l'un de mes jouets favoris) du fait du très faible volume de données dans chaque fichier, mais si tu as besoin d'une solution robuste pour l'attribution de codes postaux, ce paradigme doit probablement être remis en cause. Au passage tu gagnerais en flexibilité si ton projet est susceptible d'évoluer en complexité dans le temps.

Juste à titre indicatif, je scotche ici un extrait arraché au code que j'employais il y a peu de temps encore pour trouver une liste de CP possibles, et encore tout n'est pas là, très loin de là.
► Afficher le texte
Je ne veux pas jouer les rabats-joie et, certes, mon application gérait des clients dans 49 pays qui saisissaient souvent des coordonnées fantaisistes (j'ai eu un "xx av. Daumesnil, 75012 Paris, Ukraine"), mais même dans un contexte bien plus simplifié la question est définitivement non triviale et ne rentre pas dans une macro Excel.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Ric
Niveau 1
Niveau 1
Messages : 9
Enregistré le : ven. 15 août 2014 20:04
Status : Hors ligne

Re: [..] Demande d'orientation

#9

Message par Ric »

Salut jchd :)

Je me suis rendu compte en effet du bordel, si vous me permettez l'expression, des codes postaux ^^ C'est d'ailleurs à cette occasion que j'ai réalisé qu'un code postal est un indicateur propre aux postes et n'a rien à voir avec les codes INSEE (codes officiels géographiques). J'ai inséré le PDF INSEE officiel pour les curieux en PJ.

Les codes postaux que j'aurai en entrée sont des codes d'adresses d'individus 'lambda', des codes postaux de domicile, il n'y a normalement pas de cedex ou codes spécifiques à des entités administratives (comme les armées, etc.).

Pour la petite histoire, afin de réaliser ma base de correspondance, j'avais une correspondance Arrondissement > code identifiant 'Maison' réalisée en interne. J'ai fait une jointure avec le code géographique INSEE, qui me permet ainsi d'avoir une correspondance 'code géographique commune' > code identifiant 'maison', via le dénominateur des 'arrondissements' que j'avais en commun avec ces deux tables.

A cela, j'ai fait une jointure avec cette base OpenDataSoft qui a réalisé une correspondance 'codes postaux' > 'codes géographiques'.

Ce qui m'a permis in fine d'avoir une base 'codes postaux' > codes identifiants 'Maison'. La base a été nettoyée pour ne contenir plus que ces deux champs. Je ne suis pas sûr d'avoir besoin d'avoir une base vraiment plus pointue pour cette correspondance en fait. Cela me fait quelques milliers de correspondances encore, mais que je peux encadrer il me semble.

Il est vrai qu'en cas de non reconnaissance d'un CP, la ligne serait malgré tout traitée, identifiée comme non attribuée dans cette colonne rajoutée, afin d'éviter de la 'perte en ligne' :p
Fichiers joints
Code officiel géographique.pdf
(168.17 Kio) Téléchargé 58 fois
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Demande d'orientation

#10

Message par jchd »

Bon je vois que tu as goûté à l'ampleur du problème. Mon but était surtout d'attirer ton attention sur les difficultés pratiques que bien des gens ignorent, développeurs compris. Le grand public est très laxiste avec la saisie des adresses et, dans le cas de la vente en ligne, fait souvent livrer à une tierce personne dont l'adresse complète est encore moins précise. Les plate-formes de vente (eBay, PriceMinister, Amazon, RueDuCommerce et autres) ne valident quasiment rien de ce que le vulgaris pecus saisit.

Perso, je gère aussi les codes INSEE bien sûr. Par contre sache que les CEDEX ne sont pas réservés aux entreprises et se rencontrent de plus en plus dans les adresses de résidences, lotissement, etc.

Enfin, si tu considères que les CP que tu reçois sont corrects et ne demandent pas de validation avec le reste de l'adresse, le problème est en effet beaucoup moins tortueux.

Pour info à qui lirait ceci, il y a aussi le cas amusant des CP dont le département du bureau distributeur ne correspond pas au département de la commune (j'en avais 30 en 2009).

Heureusement tu es bien informé de ces aspects et tu n'as clairement pas besoin de mes mises en garde.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Ric
Niveau 1
Niveau 1
Messages : 9
Enregistré le : ven. 15 août 2014 20:04
Status : Hors ligne

Re: [..] Demande d'orientation

#11

Message par Ric »

jchd a écrit :Bon je vois que tu as goûté à l'ampleur du problème. Mon but était surtout d'attirer ton attention sur les difficultés pratiques que bien des gens ignorent, développeurs compris.
Je te remercie d'avoir dans le doute attiré mon attention sur cette problématique. J'ai l'espoir de ne pas rencontrer trop d'originalités dans les CP qui seront traités. J'espère ne pas être trop ambitieux. J'ignorais que certaines résidences pouvaient se mettre aux CEDEX, il va peut-être falloir que j'y fasse attention.
jchd a écrit :Pour info à qui lirait ceci, il y a aussi le cas amusant des CP dont le département du bureau distributeur ne correspond pas au département de la commune (j'en avais 30 en 2009).
Je l'ai constaté par hasard, avec mes jointures par arrondissement. J'ai cru en effet à une erreur, avant de vérifier manuellement ces entrées.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Demande d'orientation

#12

Message par jchd »

Je l'ai constaté par hasard, avec mes jointures par arrondissement. J'ai cru en effet à une erreur, avant de vérifier manuellement ces entrées.
Cela correspond à des communes situées quasiment hors de portée du bureau distributeur intra-département le plus proche (pas de pont proche ou de route directe [village sur l'autre flanc d'une vallée encaissée] ce qui obligerait à un détour ruineux pour une déserte "normale"), ou à des enclaves.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Ric
Niveau 1
Niveau 1
Messages : 9
Enregistré le : ven. 15 août 2014 20:04
Status : Hors ligne

Re: [R] Demande d'orientation

#13

Message par Ric »

Bonsoir à tous :)

J'ai passé le week-end à bricoler, en m'aidant et m'inspirant de ce que vous m'avez suggéré. Je vous remercie, cela m'a fait gagner beaucoup de temps.

Tout n'est pas complétement finalisé, mais cela fonctionne, malgré quelques petits détails à insérer et tester. J'avais quelques fichiers sources originaux (les CSV) avec moi pour faire quelques essais. Sur ces derniers c'était fonctionnel. A voir si avec d'avantages d'essais sur les autres dans le courant de la semaine c'est toujours aussi concluant.

Je me suis essentiellement inspiré de la proposition de jguinch : plutôt que de chercher à supprimer, insérer, etc., chacune des lignes est lue et réécrite à la volée ou non en respectant les conditions définies de lecture, complétée d'informations complémentaires en fonction de certains contenus (le code identifiant 'maison' par exemple), réagencée suivant mon besoin directement au moment de l'écriture.

En tous les cas merci des suggestions, cela m'a permis de pouvoir ramener quelque chose pour demain et ça a bien occupé -utilement- mon week-end ^^ A bientôt ;)
Répondre