[R] Formatage d'un fichier texte particulier

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

[R] Formatage d'un fichier texte particulier

#1

Message par pierrotm777 »

Bonjour,

Pour une application particulière , Ride Runner , Front End Carpc, j'ai besoin de reformater un fichier
de POI (points d'intéret GPS) , au format Garmin .csv dans le même format .csv ou .txt :
Téléchargeable ici par exemple:
http://www2.alertegps.com/download_basi ... ous_menu=1

On y obtient 4 fichiers:
RF.csv , radars fixe
RFR.csv, radars feu rouge
RM.csv, radars mobile
ZD.csv, zones dangereuses


Exemple du format de ces 4 fichiers (ZD.csv n'ayant pas de vitesse définie ex: @110)
55.50166,-21.30224,"Num 3461@110" (Radar fixe)
55.42566,-21.30207,"Num 3457@110" (Radar feu rouge)
55.30042,-21.23435,"Num 3455@90" (Radar Mobile)
55.30413,-20.96288,"Num 3456" (Zone Danger)

Le format Garmin est le suivant :
Longitude,Latitude,"Numéro_du_POI@vitesse"

Je voudrais obtenir:
Latitude,Longitude,"RADAR_FIXE vitesse"

Ce qui pourrais donner pour les 4 types de fichiers ci-dessus:
soit :

-21.30224,55.50166,"RADAR_FIXE_110"
-21.30207,55.42566,"RADAR_FEU_ROUGE_110"
-21.23435,55.30042,"RADAR_MOBILE_90"
-20.96288,55.30413,"ZONE_DANGER"

Je voudrais pouvoir donc formater ces 4 fichiers en les sélectionnant par un bouton ouvrant une liste (browser),
et au final concaténer en un seul fichier final au même format .csv ou .txt .

Je vous remercie par avance de votre aide
Modifié en dernier par pierrotm777 le mer. 29 avr. 2009 19:59, modifié 3 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11784
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#2

Message par Tlem »

Pour vous mettre sur la voie, voici ce que vous devez faire :

- Lire le fichier source séquentiellement dans une boucle :

Code : Tout sélectionner

FileOpen...
...
While 1
     ...
     FileReadLine...
     ...
Wend
FileClose
- Traiter chaque ligne lue pour en retirer les informations désirées.
En l'occurrence vous pouvez utiliser la virgule comme séparateur à l'aide de la fonction StringSplit.

- Suite au traitement précédent, vous vous retrouverez avec 3 'blocs' de données :
Bloc 1 = Longitude
Bloc 2 = Latitude
Bloc 3 = "Numéro_du_POI@vitesse"
Vous devez donc faire d'autres traitement pour décomposer le bloc 3.
Là encore, la fonction StringSplit ou encore mieux la fonction StringRegExp vous permettront d'extraire la vitesse.

En ce qui concerne le type de radar, là c'est un tout petit peut plus complexe, mais pas impossible.
Personnellement, j'opterais pour la recherche de chaine complète avec la fonction StringinStr.
Genre : Si la chaine "Radar fixe" existe alors écrit "RADAR_FIXE_" + $Vitesse

Voilà les grandes lignes.
En utilisant l'outil de recherche du forum, vous pourrez trouver de nombreux exemples utilisant les fonctions que j'ai cité. :wink:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#3

Message par pierrotm777 »

Merci beaucoup,

Comme toujours vous êtes présent pour aider
les plus déminis ( en neurones comme moi) , et
je vous en remercie .

Je vais tenter de travailler un peu la dessu et vous demanderais peu être à nouveau de l'aide .

Merci de votre réponse .
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11784
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#4

Message par Tlem »

Commencez à construire votre script et si vous êtes bloqué, laissez un message pour nous dire quel problème vous rencontrez. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#5

Message par pierrotm777 »

Bon surtout ne riez pas, voici mon œuvre.
Je n'ai que de vague notion de basic .

Je n'arrive pas à ouvrir les 4 fichiers en même temps .

J'ai réussi à ouvrir un fichier et le lire mais je ne passe à la deuxième ligne
qu'en appuyant sur OK .

J'ai réussi aussi à créer un fichier de sortie mais vide .

Je joind se fichier .

Merci par avance
Fichiers joints
radars.zip
(257.65 Kio) Téléchargé 109 fois
csv2gpsexec.au3
(2.55 Kio) Téléchargé 111 fois
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11784
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#6

Message par Tlem »

Le début me parait correct.
Votre problème vient du fait que vous faite d'abord une boucle de lecture puis une autre boucle pour l'écriture.

De plus, dans la première boucle, vous attribuez chaque ligne à la variable $line_in (ça c'est bon) mais par la suite vous re-définissez cette variable par "l'éclatement" de la ligne : "Longitude,Latitude,Numero@Vitesse"
Déjà, ce n'est pas cette phrase qu'il faut spliter, mais la variable $line_in puisqu'elle contient la chaine à traiter.
Ensuite le résultat sera répartit dans cette nouvelle variable $line_in mais avec un petit quelque chose en plus (voir l'aide de cette fonction).

Ensuite, dans cette boucle, à quel moment enregistrez vous le résultat dans le fichier de sortie ???
Hé oui tout le traitement doit ce faire dans la même boucle et non dans deux boucle séparée. ;)

Une autre solution serait de lire l'intégralité du fichier et de le mettre directement sous forme de tableau grâce à la fonction _FileReadToArray.
Une fois le tableau obtenu, il suffit de le lire ligne par ligne (tout ça ce fait en mémoire, donc plus rapide) et de faire une suite de traitements pour obtenir la ligne de résultat.
On re-définit la ligne du tableau avec le résultat obtenu et ainsi de suite.
Une fois tout le tableau modifié, en enregistre le tout avec _FileWriteFromArray (avantage : une seule lecture et une seule écriture sur le disque).
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#7

Message par pierrotm777 »

Bon je m'y remet aujourd'hui .

J'en rie d'avance . Allez , le ridicule ne tue pas .

Merci de votre soutient .

A bientôt .
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#8

Message par pierrotm777 »

Je pense avoir suivi vos indications .

je pense que l'inversion de mes 3 éléments par ligne (Longitude Latitude Nom@Vitesse)
se situe dans cette commande mais je n'arrive pas à la retranscrire :

$avUser = _FileListToArray($file_in[$2]&","&$file_in[$1]&","&$file_in[$3])

Mont but étant de faire passer la 2eme variable devant la premiere et laisser la troisieme à sa place
pour un traitement suivant .
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11784
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#9

Message par Tlem »

Après avoir jeté un oeil sur votre script, je me suis dit qu'il serait bien de vous donner un bon coup de main. ;)

Voici donc ce que ça peut donner :
► Afficher le texteCode
Certes, c'est un code complet et fonctionnel. 8)
Mais j'ai tellement commenté le script, que j'espère que vous le lirez et comprendrez comment j'y suis arrivé.
Bonne lecture...

Je me permet de supprimer votre script précédent en fichier joint car il n'a plus grand intérêt.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#10

Message par pierrotm777 »

Bonjour avant tout, et surtout merci , c'est exactement ce que je souhaitai .

Je m'étais juste trompé sur le format final et est donc donc modifié la ligne
de recomposition du tableau comme suit :

$aRadars[$i] = $Latitude & ',' & $Longitude & ',,,500,M,"' & $TypeRadar & "_" & $Vitesse & '"'

car le format final est celui la :
LATTITUDE,LONGITUDE,MINHDG,MAXHDG,DIST,UNIT,"SPEEDCAM-TYPE_SPEED"

Si j'osais, je vous demanderais bien un petit ajout de code .

-Serait-il possible d'avoir une option à cocher en plus permettant la concaténation des 4 fichiers ou pas .
-Choix de l'unité entre MI=Miles, FT=Feet, YD=Yards, KM=Kilometers, M=Meters
-Définition des options MINHDG MAXHDG que l'on pourrai saisir dans la fenêtre GUI .

-Serait-il possible de définir un fichier de configuration de cet outil , soit csv2gpsexec.ini , afin
que l'exécutable , csv2gpsexec.exe puisse soit être lancé comme actuellement ,ou dans une ligne de commande
où il viendrait alors lire le nécessaire dans ce fichier ini .

Je vous proposerais bien le contenu du fichier ini suivant:

Code : Tout sélectionner

[csv2gpsexec.ini]
;define if csv2gpsexec run with (true) or without (false) a GUI : default is false
with_gui=false
;you can define all files in entry here
files_in=file_1.csv,file_2.csv,file_3,csv,file_n.csv
;define here the final file name
file_out=speedcam.csv
;define if concatenation is on or off (true or false , default is true)
concatenation=true
;define here the units (MI=Miles, FT=Feet, YD=Yards, KM=Kilometers, M=Meters ; default is M)
units=M
;define here Minimun and Maximum trigger heading (default is nothing)
MINHDG=
MAXHDG=
Dernier détail, ce programme est dédié à une communauté de gens qui s'entre-aident
dont le hobby est le CarPc , je souhaite donc le diffuser gratuitement sur le site
http://www.mp3car.com/vbulletin/softwar ... velopment/ avec votre autorisation
et une indication précisant que cet outil a été fait par vous peu être .


Merci encore par avance
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11784
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#11

Message par Tlem »

Le 'petit' ajout de code implique pas mal de travail, et me semble plus complexe à mettre en œuvre que vous ne semblez le croire (je me fait aussi peut être des idées ;) ).

Mais dans l'idée, il serait peut être bien de revoir la GUI pour mettre 4 lignes de sélection de fichiers (1 pour RF, 1 pour RM, 1 pour RFR et 1 pour Zone dangereuse).
Pour la vitesse, ce n'est sans doute que du calcul de base.
Pour le MINHDG et le MAXHDG, je ne vois pas ce que c'est.

En ce qui concerne la diffusion du script/programme, vous pouvez faire comme vous l'entendez (je ne pose pas de copyright sur mes partages du forum 8) ).
Vous pouvez même omettre de citer l'auteur ou le forum, ça ne me posera aucun problèmes.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#12

Message par pierrotm777 »

J'ai essayé de travailler un peu en faisant quelques ajout .
Notamment au niveau du GUI .

MINHDG et MAXHDG sont deux options en degrés qui peuvent prendre la valeur de 0 à 360°, (on peu ne rien u mettre) .

Je cherche un peu mais bon .
Fichiers joints
csv2gpsexec_mod.au3
(6.32 Kio) Téléchargé 69 fois
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11784
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#13

Message par Tlem »

J'aurais plutôt vu quelque chose comme ceci :
► Afficher le texteCode
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#14

Message par pierrotm777 »

Oui cela a beaucoup de gueule :

Pour le fichier .ini j'ai péparé cela :

Code : Tout sélectionner

If Not FileExists(@ScriptDir & "\csv2gpsexec.ini") Then
   
    IniWrite("csv2gpsexec.ini", "csv2gpsexec.ini", "with_gui ", "false or true default=false")
    IniWrite("csv2gpsexec.ini", "csv2gpsexec.ini", "files_in ", "add files.csv , ex:files1.csv,files2.csv,...filesn.csv")
    IniWrite("csv2gpsexec.ini", "csv2gpsexec.ini", "file_out ", "file_out name")
    IniWrite("csv2gpsexec.ini", "csv2gpsexec.ini", "concatenation ", "concatenation all files , false or true default=false")
    IniWrite("csv2gpsexec.ini", "csv2gpsexec.ini", "units ", "unit (MI,FT,YD,KM,M) default is M")
    IniWrite("csv2gpsexec.ini", "csv2gpsexec.ini", "minhdg ", "Minimun trigger heading at location in degres(default=nothing)")
    IniWrite("csv2gpsexec.ini", "csv2gpsexec.ini", "maxhdg ", "Minimun trigger heading at location in degres(default=nothing)")
    

EndIf
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#15

Message par pierrotm777 »

bon,
J'ai fait les modifications selon vos conseils et j'ai un problem au
niveau du bouton OK
Je pense que pour concaténer il me faudrait ajouter les résultat de chaque fichier séparé de @CRLF .

J'ai bon ou pas du tout ?
Fichiers joints
csv2gpsexec_mod2.au3
(9 Kio) Téléchargé 91 fois
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11784
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#16

Message par Tlem »

Dans la partie concernant le bouton OK, vous devriez lire chaque input sensé contenir un nom de fichier, contrôler si les fichiers existes.
Si une case est vide ou si un fichier n'existe pas, alors mettre la variable du chemin à vide.

Pour concaténer :
Faites une boucle de traitement sur les 4 fichiers.
Si Vide, ont passe, sinon lit ont les fichiers ligne par ligne ou par un tableau, puis ont fait le traitement.
Ensuite on ajoute le résultat à une variable.

Code : Tout sélectionner

$MaVar = $MaVar & $MaChaineTraitee & @CRLF
Il est vrais que dans l'exemple précédent, j'ai zappé cette partie car je croyais traiter un seul fichier à la fois.
Cette méthode permet de 'créer' le fichier de destination en mémoire.
Pour finir, il ne reste plus qu'à écrire cette chaîne dans le fichier de destination et le tour est joué.

Pour la partie avec le fichier .ini, je vous laisse faire, car en ce qui me concerne, je trouve qu'avec le nombre de choix possible et vu la gestion de fichiers multiples, cela ressemblera plus à une usine à gaz, qu'à un script simple.

PS : Il est inutile de garder l'historique de toutes les versions de votre script.
Editer la première version et à chaque modif indiquez le lien.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#17

Message par pierrotm777 »

Bonjour,

Merci de votre réponse .

Je vais essayer aujourd'hui de tenir compte de vos conseils.

Je viens juste de réaliser que vous êtes aussi de Bordeaux.

Au plaisir
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#18

Message par pierrotm777 »

Bonjour,

Je pense avoir un peu travailler sur le sujet .

-J'ai réussi à récupérer tous les input
-Sur la concaténation j'ai bien gardé un test de bouton radio qui conditionne la somme des variables , mais si je choisi cet option ,
le soft ne va pas plus loin .
-Si je ne choisi pas dans le combo l'unité, M n'arrive pas par défaut .
-Seul le dernier fichier est pris compte quelque fichier que je choisisse.
-Dans le "A Propos" Je voudrais que le lien soit cliquable .

Pouvez vous m'aiguiller ?

Merci par avance d'un coup de pouce.
Fichiers joints
csv2gpsexec_mod2.au3
(12.4 Kio) Téléchargé 157 fois
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11784
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#19

Message par Tlem »

Je n'ai mis aucun commentaire et je ne l'ai pas testé à fond, mais ceci devrait fonctionner :
► Afficher le texteCode
Je veux bien que le site soit cité dans la liste des crédits. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Formatage d'un fichier texte particulier

#20

Message par pierrotm777 »

Bonjour,

Et merci pour votre aide .
C'est exactement ce que je voulais .
Juste une remarque , dans le fichier concaténé , il n'y a pas de retour ligne entre chaque type de radar ce qui donne ceci:

57.6725,-2.00621,,,500,M,"RADAR_FIXE_60"16.15745,-61.58584,,,500,M,"RADAR_MOBILE_110" au lieu de ceci :

57.6725,-2.00621,,,500,M,"RADAR_FIXE_60"
16.15745,-61.58584,,,500,M,"RADAR_MOBILE_110"


J'ai donc modifié la ligne suivante :

Code : Tout sélectionner

FileWrite("Radars_Fusion.csv", $sRF & $sRM & $sRFR & $sZD)
par

Code : Tout sélectionner

FileWrite("Radars_Fusion.csv", $sRF & @CRLF & $sRM & @CRLF & $sRFR & @CRLF & $sZD)

Les lien de A Propos s'ouvrent dans la fenêtre A Propos au lieu du navigateur par défaut IE ou Firefox .

J'avais remarqué que dans le fichier ZD.csv trés peu de ligne avaient une vitesse de définie.
On se retrouvait alors avec des lignes du genre "ZONE_DANGEREUSE_" .

J'ai donc ajouté cette ligne de test dans la boucle ci-dessous :

Code : Tout sélectionner

For $i = 1 To $aRadars[0]
        $Var = StringSplit($aRadars[$i], ",")
        $Longitude = $Var[1]
        $Latitude = $Var[2]
        $Var2 = StringSplit($Var[3], '@"')
        $Vitesse = $Var2[3]
        [color=#FF0000]If $Vitesse = "" Then $Vitesse = 0[/color]
        $aRadars[$i] = $Latitude & ',' & $Longitude & ',' & $Mxhdg & ',' & $Mnhdg & ',' & _
                $Dst & ',' & $Unt & ',"' & $TypeRadar & "_" & $Vitesse & '"'
    Next
Ainsi , "ZONE_DANGEREUSE_" devient "ZONE_DANGEREUSE_0" lorsque aucune vitesse n'est trouvée .

Où puis-je trouver un exemple d'option de langage ? Je pensais par exemple à
la mise en place d'une option venant lire un fichier French.lang ou English.lang afin de rendre ce logiciel multilangue .

Pensez vous que la version finale intéresse ce forum , en ce cas il est à disposition .

Je compte ajoutez mes remerciement dans le à Propos , http://www.autoitscript.fr/forum/ , et votre pseudo , Tlem .

Voila , Je vous remercie encore beaucoup car j'ai beaucoup appris et je compte bien
persévérer avec votre aide .
Modifié en dernier par Tlem le sam. 07 févr. 2009 22:09, modifié 1 fois.
Raison : Ajout des balises de code
Répondre