[Résolu] Extraire une chaîne numérique d'une alphanumérique

Discussions à propos du tableur Calc.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur : Vilains modOOs

Règles du forum
Cette section est uniquement dédiée au tableur Calc. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.
christb23
Fraîchement OOthentifié
Messages : 1
Inscription : 03 févr. 2007 18:21

[Résolu] Extraire une chaîne numérique d'une alphanumérique

Message par christb23 »

Bonjour,

J'ai dans un tableau une liste d'adresses dans une cellule sur une seule colonne (une adresse par cellule).
Je souhaiterais extraire une chaine numérique (code postal) d'une chaine alphanumerique (adresse) exemple :
10 rue du General de Gaulle 75000 Paris, je voudrais isolé le 75000 dans une nouvelle colonne

Quelle formule pourrais-je utiliser ?

Merci d'avance

OOo 2.0.4 + Win XP SP2
OO 2.0.4
Wondows XP
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16960
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Message par jeanmimi »

Bonsoir et bienvenue,

La fonction GAUCHE, décrite ici sur le site de Christian :
http://christianwtd.free.fr/index.php?r ... 1#FnGAUCHE devrait répondre à ton attente.
LibreOffice : Version : 24.2 (x64)(12 avril 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Message par Pierre-Yves Samyn »

Bonjour

Je ne vois pas comment une seule fonction pourrait résoudre ton problème ?

Ci-dessous une procédure en trois étapes : Cherche-Remplace / Enregistrement / Ouverture qui devrait répondre à la question...

Le principe sera d'utiliser le cherche-remplace pour insérer un point-virgule devant et derrière le code postal. Ensuite, on enregistre la feuille au format texte, puis on ouvre ce nouveau fichier : un dialogue permet alors de séparer les colonnes en fonction du séparateur choisir (le point virgule en l'occurrence).

Concrètement :

1) Edition / Rechercher

Rechercher

Code : Tout sélectionner

[:digit:]{5}
Remplacer

Code : Tout sélectionner

;&;
et cliquer sur "Autres options" pour cocher la case "Expressions régulières"
Puis, faire "Remplacer tout".

Avec cette commande on recherche une série de 5 chiffres, que l'on remplace par elle-même (&) précédée et suivie du point-virgule.

2) Fichier / Enregistrer sous / Type : Texte CSV (.csv)

Séparateur de champ : ;
Séparateur de texte : supprimer celui proposé

Fichier / Fermer

3) Fichier / Ouvrir / Type : Texte CSV (.csv)


Choisir le fichier texte que l'on vient de créer.
Un dialogue s'ouvre qui permet de définir le séparateur de colonne, choisir le ";"
MichelXld
Membre OOrganisé
Membre OOrganisé
Messages : 66
Inscription : 10 janv. 2006 21:33

Message par MichelXld »

bonjour


une autre possiblité ...mais pas plus simple ... ;o)

Si les adresses sont dans la colonne A, chaque mot étant séparé par un espace et en supposant que le nom des rues ne contienne pas des données numériques supérieures à 4 caractères...


Tu saisies en B1:

Code : Tout sélectionner

=SI(ESTERREUR(CNUM(SI(COLONNE()-1>NBCAR($A1)-NBCAR(SUBSTITUE($A1;
" ";""));DROITE($A1;NBCAR($A1)-TROUVE("^^";SUBSTITUE($A1;
" ";"^^";NBCAR($A1)-NBCAR(SUBSTITUE($A1;" ";"")))));SI(COLONNE()-1=1;
STXT($A1;1;TROUVE("^^";SUBSTITUE($A1;" ";"^^";1))-1);STXT($A1;TROUVE("^^";SUBSTITUE($A1;" ";"^^";COLONNE()-2))+1;TROUVE("^^";SUBSTITUE($A1;" ";"^^";COLONNE()-1))-TROUVE("^^";
SUBSTITUE($A1;" ";"^^";COLONNE()-2))-1)))));0;
CNUM(SI(COLONNE()-1>NBCAR($A1)-NBCAR(SUBSTITUE($A1;" ";""));DROITE($A1;NBCAR($A1)-TROUVE("^^";
SUBSTITUE($A1;" ";"^^";NBCAR($A1)-NBCAR(SUBSTITUE($A1;" ";"")))));SI(COLONNE()-1=1;STXT($A1;1;TROUVE("^^";
SUBSTITUE($A1;" ";"^^";1))-1);STXT($A1;TROUVE("^^";SUBSTITUE($A1;" ";"^^";COLONNE()-2))+1;TROUVE("^^";SUBSTITUE($A1;" ";"^^";COLONNE()-1))-TROUVE("^^";SUBSTITUE($A1;" ";"^^";COLONNE()-2))-1)))))

Tu étires la formule vers la droite, jusqu'en L1 par exemple.
Ensuite étire les formules (de B1 à L1) vers le bas.


Reformate les colonnes B à L au format numérique.


ensuite en M1, tu saisies

=MAX(B1:L1)

que tu étires vers le bas.



bonne soirée
michel
OOo 2.1 & WinXP(sp2)
Jeff
GourOOu
GourOOu
Messages : 9628
Inscription : 18 sept. 2006 09:40
Localisation : France

Message par Jeff »

Bonsoir,

Pour ma part, j'utiliserai la formule suivante :

Code : Tout sélectionner

=STXT(A1;CHERCHE("[0-9]";A1;NBCAR(A1)/4);5)
Avant toute chose, il faut que Calc soit prêt à accepter les expressions régulières dans les formules ; pour cela, menu Outils->Options->OOoCalc->Calculs coche Autoriser les caractères génériques dans les formules.

Ton texte étant en A1, cette formule en B1 te donne le code postal en opérant de la façon suivante :
La fonction va rechercher le texte en A1, puis cherche un chiffre de 0 à 9 depuis le premier quart de l'adresse (pour zapper le numéro de rue) et en extrait les 5 caractères suivant.

A +

EDIT : tu récupère là du texte ; si il te faut un nombre, rajoute une fonction CNUM pour convertir ce texte en nombre :

Code : Tout sélectionner

=CNUM(STXT(A1;CHERCHE("[0-9]";A1;NBCAR(A1)/4);5))
Etant entendu qu'avec cette dernière formule tu as un nombre, les codes postaux commençant par zéro commencerons alors par le premier chiffre significatif (5000 pour 05000 par ex.) à moins d'avoir formater tes cellules en nombres avec un format défini par l'utilisateur du type

Code : Tout sélectionner

00 000
EDIT 2 : si tu as des chiffres dans ton adresse (159, rue du 11 Novembre 99999 Saturne) il te faudra adapter la fonction NBCAR qui détermine le début de la recherche : NBCAR(A1)/2 pour chercher à partir de la moitié de l'adresse. Attention : si c'est ta ville qui comporte trop de caractères (57,rue Foch 00000 La-lune-notre-satellite) tu tombe dans le piège inverse, la moitié de cette adresse étant après le code postal...
Dernière modification par Jeff le 04 févr. 2007 21:20, modifié 2 fois.
MichelXld
Membre OOrganisé
Membre OOrganisé
Messages : 66
Inscription : 10 janv. 2006 21:33

Message par MichelXld »

bonsoir
Pour ma part, j'utiliserai la fonction suivante :
Code:
=STXT(A1;CHERCHE("[0-9]";A1;NBCAR(A1)/4);5)

:bravo:


michel
OOo 2.1 & WinXP(sp2)
Jeff
GourOOu
GourOOu
Messages : 9628
Inscription : 18 sept. 2006 09:40
Localisation : France

Message par Jeff »

:oops: merci Michel, vu ton niveau sur Calc, j'suis flatté de tes applaudissements !
J'ai cependant mis un "EDIT 2" dans mon post précédent pour définir les limites de la formule...
Jeff
GourOOu
GourOOu
Messages : 9628
Inscription : 18 sept. 2006 09:40
Localisation : France

Message par Jeff »

Allez, juste pour le plaisir, une dernière formule, qui résiste aux 2 exemples impropables (rue du 11 novembre à Saturne, et la ville la-lune-notre-satellite) :

Code : Tout sélectionner

=SI(ESTERREUR(CNUM(STXT(A1;CHERCHE("[0-9]";A1;NBCAR(A1)/2);5))); CNUM(STXT(A1;CHERCHE("[0-9]";A1;NBCAR(A1)/4);5));CNUM(STXT(A1;CHERCHE("[0-9]";A1;NBCAR(A1)/2);5)))
Celle-ci cherche depuis le milieu de l'adresse, et si une erreur est retournée, elle recherche alors depuis le premier quart de l'adresse... :wink:
Dernière modification par Jeff le 05 févr. 2007 13:01, modifié 1 fois.
Jeff
GourOOu
GourOOu
Messages : 9628
Inscription : 18 sept. 2006 09:40
Localisation : France

Message par Jeff »

Et pour finir en beauté, il faut utiliser l'expression régulière donnée par Pierre-Yves Samyn, afin que la recherche ne se fasse que sur 5 chiffres consécutifs :

Code : Tout sélectionner

=STXT(A1;CHERCHE("[:digit:]{5} ";A1;1);5)
A utiliser selon mon post du 04/02 à 20:47 (ne plus tenir compte du EDIT2 du-dit message)

Merci de mettre [Résolu] dans ton titre en cliquant sur Editer de ton premier message si tel est le cas :wink:
Dernière modification par Jeff le 05 févr. 2007 13:03, modifié 1 fois.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Message par Pierre-Yves Samyn »

+1 pour les :bravo:

mais maintenant... arrêtez tous les deux... vous allez me faire mentir en descendant à une seule fonction pour résoudre le problème :D