Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/03/2011, 17h29   #1
Invité de passage
 
Inscription : mars 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 9
Points : 4
Points : 4
Par défaut Classement d'une liste d'adresses postales

Bonjour,

Je suis plutôt débutant en Javascript, et je cherche ordonner une liste d'adresse postales pour la rendre plus lisible et éviter les information redondantes
Je souhaite par exemple les classer par Pays > Ville > Rue > numéro de rue
Pour transformer ceci :

Liane, 74160 Neydens, France
Route de la Salette, 74160 Neydens, France
800 Chemin de Chez Leclerc, 74160 Neydens, France
909-969 Chemin de Chez Leclerc, 74160 Neydens, France
A41, 74160 Saint-Julien-en-Genevois, France
E25, 1257 Bardonnex, Suisse
Route de Pré-Marais 67, 1233 Bernex, Suisse
Route de Pré-Marais 75, 1233 Bernex, Suisse


en cela :
  • France
  • Neydens (74160)
  • Liane
  • Route de la Salette
  • Chemin de Chez Leclerc
  • 800
  • 909-969
  • Suisse
  • Bardonnex (1257)
  • Bernex (1233)
  • Route de Pré-Marais
  • 67
  • 75

Voici le code que j'ai fait pour essayer d'exécuter cela

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
 
var monAdresse = "800 Chemin de Chez Leclerc, 74160 Neydens, France";
 
// Tablaux por stoquer les différentes parties d'adresse
var tabPays = new Array();
var tabVille = new Array();
var tabNumeroRue = new Array();
var tabRue = new Array();
var adresseIterator = 0;
 
 
var html = "";
html += "<table cellspacing='0' cellpadding='5' border='0'>";
 
// Séparation des monAdresse à chaque virgule
var separateurVirgule = new RegExp('[,]+','g');
var adressePart = monAdresse.split(separateurVirgule);
 
if(adressePart == null){
    html += "<tr><td>Aucun élémént trouvé ! ...</td></tr>";
} else {
    // Sépration de la rue de 2 parties séparées par un espace
    var separateurEspace = new RegExp('[ ]+','g');
    var ruePart = adressePart[0].split(separateurEspace);
    for (g = 1 ; g < ruePart.length; g++){
        if (tabRue[adresseIterator] != null){
            tabRue[adresseIterator]=(tabRue[adresseIterator]+" "+ruePart[g]);
        } else{
            tabRue[adresseIterator]=ruePart[g];
        }
    }
    // On place des différentes parties dans les tableaux correspondant
    tabNumeroRue[adresseIterator]=ruePart[0];
    tabVille[adresseIterator]=adressePart[1];
    tabPays[adresseIterator]=adressePart[2];
    adresseIterator ++;
}
 
// Factorisation et Affichage
for (var f = 0; f < tabRue.length; f++ ){
    if (tabPays[f] != null){
        // Si le pays n'est pas identique à celui de l'adresse précédente
        if (tabPays[f] != tabPays[f-1]){
            html += "<tr><td nowrap>" + tabPays[f] +"</td></tr>";
            if (f > 0 ){
                // Si la ville n'est pas identique à celle de l'adresse précédente
                if (tabVille[f] != tabVille[f-1]){
                    html += "<tr><td nowrap>---"  + tabVille[f] +"</td></tr>";
                    // Si l'adresse n'est pas identique à celle de l'adresse précédente
                    if (tabRue[f] != tabRue[f-1]){
                        html += "<tr><td nowrap>------"  + tabRue[f] +"</td></tr>";
                        html += "<tr><td nowrap>----------------"  + tabNumeroRue[f] +"</td></tr>";
                    } else{
                        html += "<tr><td nowrap>----------------"  + tabNumeroRue[f] +"</td></tr>";
                    }
                }else{
                    // Si l'adresse n'est pas identique à celle de l'adresse précédente
                    if (tabRue[f] != tabRue[f-1]){
                        html += "<tr><td nowrap>------"  + tabRue[f] +"</td></tr>";
                        html += "<tr><td nowrap>----------------"  + tabNumeroRue[f] +"</td></tr>";
                    } else{
                        html += "<tr><td nowrap>----------------"  + tabNumeroRue[f] +"</td></tr>";
                    }
                }
            } else{
                html += "<tr><td nowrap>---"  + tabVille[f] +"</td></tr>";
            }
 
        } else {
            if (f > 0 ){
                if (tabVille[f] != tabVille[f-1]){
                    html += "<tr><td nowrap>---"  + tabVille[f] +"</td></tr>";
                    // Si l'adresse n'est pas identique à celle de l'adresse précédente
                    if (tabRue[f] != tabRue[f-1]){
                        html += "<tr><td nowrap>------"  + tabRue[f] +"</td></tr>";
                        html += "<tr><td nowrap>----------------"  + tabNumeroRue[f] +"</td></tr>";
                    } else{
                        html += "<tr><td nowrap>----------------"  + tabNumeroRue[f] +"</td></tr>";
                    }
                }else{
                    // Si l'adresse n'est pas identique à celle de l'adresse précédente
                    if (tabRue[f] != tabRue[f-1]){
                        html += "<tr><td nowrap>------"  + tabRue[f] +"</td></tr>";
                        html += "<tr><td nowrap>----------------"  + tabNumeroRue[f] +"</td></tr>";
                    } else{
                        html += "<tr><td nowrap>----------------"  + tabNumeroRue[f] +"</td></tr>";
                    }
                }
            } else{
                html += "<tr><td nowrap>---"  + tabVille[f] +"</td></tr>";
            }
        }
 
    }
}
 
 
html += "</table>";
tableDiv.innerHTML = html;
Ce n'est pas très propre, j'aimerai bien pouvoir simplifier le truc, peu être avec des expressions régulières (car j'ai encore des erreurs sur certains type d'adresse)
Si vous connaissez de meilleurs fonctions pour faire ça mieux, ou quelqu'un ayant déjà fait un traitement similaire, ou des regex pour extraire proprement l'adresse je suis prenneur.

Merci d'avance
Kwenji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 20h32   #2
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 450
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 450
Points : 2 149
Points : 2 149
Tu ne nous dis pas comment sont présentées tes adresses actuellement.

T'as ça dans un tableau de String ? Dans une table HTML ? Dans une liste de LI ?

Quoi qu'il en soit, ton approche avec plusieurs tableaux pour écrire le résultat me paraît douteuse : tes tableaux sont distincts les uns des autres alors que les données sont liées entre elles.

A la rigueur faire un tableau associatif :
Code :
1
2
3
4
5
var pays = new Array();
pays["France"] = new Array();
var villes = pays["France"];
villes["Neydens"] = new Array();
// ...
Quant à la regex, les exemples que tu nous donnes comme adresses sont relativement proches les uns des autres (sémantiquement parlant) donc ça devrait être possible. Par contre si tu veux travailler avec une regex il faut que tu disposes de l'ensemble des écritures possibles (là par exemple y'a des numéros séparés ou non par des tirets, avant ou après le nom de la rue ; t'as un exemple sans rue, mais t'as pas d'exemple sans numéro).
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 22h00   #3
Invité de passage
 
Inscription : mars 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 9
Points : 4
Points : 4
Citation:
Envoyé par Loceka Voir le message
Tu ne nous dis pas comment sont présentées tes adresses actuellement.

T'as ça dans un tableau de String ? Dans une table HTML ? Dans une liste de LI ?
Ah, oui, monAdresse correspond à un string dans un tableau, je parcours donc ce tableau pour faire le traitement, et je prévois de placer les strings extraites dans un tableau HTML (ou des divs) pour gérer ensuite la mise en page.

Ok pour les tableaux à plusieurs dimension c'est vrai que ça a plus de sens, merci

Pour ce qui est des regex, ma façon de tronquer la chaine semble correcte ou il y a une manière d'exclure directement une regex d'une String ?
Citation:
Envoyé par Kwenji Voir le message
var separateurEspace = new RegExp('[ ]+','g');
var ruePart = adressePart[0].split(separateurEspace);
Merci encore
Kwenji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 10h20   #4
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 450
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 450
Points : 2 149
Points : 2 149
Alors déjà pour faire un split tu n'as pas réellement besoin d'une regex. Tu peux très bien écrire :L'utilisation de regex se justifie quand tu cherches à matcher des éléments plus "complexes". Ici, tu pourrais par exemple utiliser les regex pour récupérer les différents éléments :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
var adresse = "800 Chemin de Chez Leclerc, 74160 Neydens, France";
if (adresse.match(/^(.*),(.*),(.*)$/)) {
	var numeroRue = RegExp.$1;
	var ville = RegExp.$2;
	var pays = RegExp.$3;
	var numero;
	var rue;
	if (numeroRue.match(/^(\d+)\s+([^\d]+)$/)) {
		numero = RegExp.$1;
		rue = RegExp.$2;
	}
}
C'est juste un exemple, le code est loin d'être complet et de traiter tous les cas hein.

Edit :
Je ne connais pas de bon tuto sur les regex mais tu peux déjà avoir un aperçu des différentes notations ici : http://javasearch.developpez.com/j2s...x/Pattern.html.

Dans mon code par exemple, le "\d" est identique à "[0-9]", ce qui veut dire tous les caractères entre "0" et "9" (soit tous les chiffres).
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 10h14   #5
Invité de passage
 
Inscription : mars 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 9
Points : 4
Points : 4
Merci Loceka

Donc j'ai essayer de simplifier un peu mon truc, après réflexion il n'est pas intéressant pour mon application d'avoir un gestion des redondances des adresses non successives... en gros si deux position sont identiques mais pas successives elles doivent pouvoir se reafficher.
Et comme je prévoir par la suite d'associer des URL aux position une rue doit pouvoir est associée facilement à la ville de sa position, la ville au pays au moyen d'un identifiant unique.

Dans le code suivant j'ai un soucis dans ma mise en place des tableaux à plusieurs dimmesions,
Code :
1
2
 
html += '<li>' + positions[i][0] + '</li>';
me génère un undefined

Si vous avez une idée... merci d'avance
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
	<script type="text/javascript">
		var adresses = new Array(
		    "Liane, 74160 Neydens, France",
		    "Route de la Salette, 74160 Neydens, France",
		    "800 Chemin de Chez Leclerc, 67000 St Emilion, France",
		    "909-969 Chemin de Chez Leclerc, 67000 Strasbourg, France",
		    "A41, 74160 Saint-Julien-en-Genevois, Belgique",
		    "E25, 12587 Bardonnex, Suisse",
		    "Route de Pré-Marais 67, 12363 Bernex, Suisse",
		    "Route de Pré-Marais 75, 12363 Bernex, Suisse"
		    );
 
		var city = '';
		var cp = '';
		var positions = new Array();
	   	var html = '';	   
 
		function triAdresses(divId)
		{
			var emplacement = document.getElementById(divId);
 
			for (var i = 0; i < adresses.length; i++){
				var adresse = adresses[i];
 
				// On vérifie que l'adresse n'est pas nulle
				if (adresse != null){
					// Séparationd de la chaine à chaque virgule
					var adressePart = adresse.split(", ");
					// Si le pays est valide
					rawPays = adressePart[2];
					rawVille = adressePart[1];
					rawRue = adressePart[0];
					html += '<b> Traitement N ' + i + '</b><br>';
					html += '- Pays ' + rawPays+ '<br>';
					html += '- Ville ' + rawVille+ '<br>';
					html += '- Rue ' + rawRue+ '<br>';
 
					if (paysCheck(rawPays) && villeCheck(rawVille)){ // les valeurs sont valides
						    positions[i] = new Array() 
						    positions[i][0] = rawPays;
						    positions[i][1] = city;
						    positions[i][2] = cp;
						    positions[i][3] = rawRue;
 
						  	// Si c'ets le premier rang on affiche tout
						  	if (i == 0){
						  		html += '<li>' + positions[i][0] + '</li>';
						  		html += '<ul><li>' + positions[i][1] + '(' + positions[i][2] + ')</li></ul>';
						  		html += '<ul><ul><li>' + positions[i][3] + '</li></ul></ul>';
						  	// Si ce n'est pas le premier rang on doit vérifier si l'affichage est le même que le précédent	
						  	} else {
						  	 	var j = i-1;
						  		// Pays PAS le même
						  		if (positions[i][0] !=  positions[j][0]){
						  			html += '<li>' + positions[i][0] + '</li>';
						  			// Vile PAS la même
						  			if (positions[i][1] !=  positions[i-1][1]){
						  				html += '<ul><li>' + positions[i][1] + '(' + positions[i][2] + ')</li></ul>';
						  				// Rue PAS la même
						  				if (positions[i][3] !=  positions[i-1][3]){
						  					html += '<ul><ul><li>' + positions[i][3] + '</li></ul></ul>';
						  				// Rue la MEME
						  				} else {
						  					html += '<ul><ul><li>' + '*' + '</li></ul></ul>';
						  				}
						  			// Ville la MEME	
						  			} else {
						  				// Rue PAS la même
						  				if (positions[i][3] !=  positions[i-1][3]){
						  					html += '<ul><ul><li>' + positions[i][3] + '</li></ul></ul>';
						  				// Rue la MEME
						  				} else {
						  					html += '<ul><ul><li>' + '*' + '</li></ul></ul>';
						  				}
						  			}
						  		// Pays le MEME
						  		} else {
						  			// Vile PAS la même
						  			if (positions[i][1] !=  positions[i-1][1]){
						  				html += '<ul><li>' + positions[i][1] + '(' + positions[i][2] + ')</li></ul>';
						  				// Rue PAS la même
						  				if (positions[i][3] !=  positions[i-1][3]){
						  					html += '<ul><ul><li>' + positions[i][3] + '</li></ul></ul>';
						  				// Rue la MEME
						  				} else {
						  					html += '<ul><ul><li>' + '*' + '</li></ul></ul>';
						  				}
						  			// Ville la MEME	
						  			} else {
						  				// Rue PAS la même
						  				if (positions[i][3] !=  positions[i-1][3]){
						  					html += '<ul><ul><li>' + positions[i][3] + '</li></ul></ul>';
						  				// Rue la MEME
						  				} else {
						  					html += '<ul><ul><li>' + '*' + '</li></ul></ul>';
						  				}
						  			}
						  		}
						  	}           									  							
					}	
					// si le pays est déjà pris
					if (paysCheck(rawPays) == false){
						html += '<li>' + 'Erreur : format de Pays invalide' + '</li>';
					} 																			
				}
				// Si l'adresse est nulle, on affiche une erreur
				else {
					html += '<li>Erreur : Adresse vide</li>';
				}
			}							
		    emplacement.innerHTML = '<ul>' + html + '</ul>';
		}
 
		// Fonction qui test un String et renvoie 
		// - true si c'est un pays valid 
		// - false si c'est un pays valide
		// - null si le champo est vide
		function paysCheck(rawPays){
			// on vérifie que le 3ème champ n'est pas vide
            if (rawPays != null){
            	// On vérifie que le champ est bien un pays
            	var regPays = new RegExp('^[a-zA-Z -\']+$');
            	if (rawPays.match(regPays)){
            		return true;
            	} else {
            		return false;
            	}
            } else {
            	return null;
            }
        }
 
        function villeCheck(x){
        	if (x != null){
        		// On vérifie que le champ est bien un pays
        		var regVille = new RegExp('^[a-zA-Z0-9 -\']+$');
        		if (x.match(regVille)){ // La vilel a passé le premier test
        			var okVille = '';
        			//html += '- premier test ok<br>';
        			// Si la string ville contient un espace
        			if (x.indexOf(' ') != -1){ // Oui
        				//html += '- deuxieme test (espace) ok<br>';
        				var villeParts = x.split(' ');
        				// On parcourt les champs pour trouver le code postale
        				for (var j = 0; j < villeParts.length; j++){
        					var villePart = villeParts[j];
        					//html += '- villePart : '+ j +' = ' + villePart + '<br>';
        					// On cherche un code postale
        					if (cpCheck(villePart)){
        						cp = villePart;
        					}
        					else if (paysCheck(villePart)){
        						okVille += villePart + ' ';
        					} 
        				}
        			// Pas d'espace donc pas de code postale	
        			} else okVille = x;
        			city = okVille; 
        			return true;
        		} else return false;
        	} else return null;
        }
 
       function cpCheck(y){
       		if (y != null){
       			var regCp = new RegExp('^[0-9]{5}$');
       			if (y.match(regCp)){
       				return true;
       			} else return false;
       		} else return null;
       }
 
		function start()
		{
 
			triAdresses('listeAdresse');
		}
 
		window.onload=start;
	</script>
</head>
<body>
	<div class="adresse example-1" id="listeAdresse">
	</div>
</body>
</html>
Kwenji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 00h52   #6
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 757
Points : 4 757
extrait de ton code
Code :
1
2
3
var j = i - 1;
// Pays PAS le même
if (positions[i][0] != positions[j][0]) {
j vaut -1, position[j] est-il défini pour cette valeur?
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 09h51   #7
Invité de passage
 
Inscription : mars 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 9
Points : 4
Points : 4
Citation:
Envoyé par NoSmoking Voir le message
j vaut -1, position[j] est-il défini pour cette valeur?
En fait j'ai créer j pour remplacer i-1 car je en comprends pas pourquoi positions[i-1] reste undefined
en principe vu que ce bout de codes est dans un else après le if(i ==0) donc i ne peux pas être inférieur à 1....
Bref pourquoi j serait il égal à -1 ?

Merci pour ta réponse, mais je reste toujours dans le vague
Kwenji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 10h58   #8
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 757
Points : 4 757
j'avions mal lu le code et surtout la boucle...
le problème viens du fait que "A41, 74160 Saint-Julien-en-Genevois, Belgique", ne passe pas le test de villeCheck, donc tu as un décalage des i et positions[i] n'est pas initialisé pour i = 4.
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h49.


 
 
 
 
Partenaires

Hébergement Web