Bonsoir,
Je dois scinder en deux une chaîne de caractère sans couper les mots.
Ma chaine d'origine a une longueur de 100. Et mes deux chaines pour le découpage 50.
Quelqu'un a t'il une idée ?
Bonsoir,
Je dois scinder en deux une chaîne de caractère sans couper les mots.
Ma chaine d'origine a une longueur de 100. Et mes deux chaines pour le découpage 50.
Quelqu'un a t'il une idée ?
Cherchez le dernière espacé (ou autre séparateur des mots) avant le cinquantième caractère.
justement c'est la notion d'avant le 50 ieme que je ne sais pas gérer.
Pour chercher je pense utiliser la fonction :
il y a une autre fonction ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 INSTR(chaine,chaine_cherche,position)
Passez -50 dans position.
bonjour,
j'ai essayé l'idée mais cela ne convient pas :
voici un exemple :
le résultat renvoyé est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 select length(SUBSTR('MA TRES LONGUE CHAINE DE CARACTERE A DECOUPER EN DEUX CHAINES DE CARACTERES',0,INSTR('MA TRES LONGUE CHAINE DE CARACTERE A DECOUPER EN DEUX CHAINES DE CARACTERES',' ',50))) from dual
correspondant à une longueur de 54. Donc au delà de la taille maximale de mes sous chaines.MA TRES LONGUE CHAINE DE CARACTERE A DECOUPER EN DEUX
le résultat attendu serait plutot :
correspondant à un découpage à 47 ... donc moins de 50.MA TRES LONGUE CHAINE DE CARACTERE A DECOUPER EN
Merci pour votre aide
La réponse est au niveau du CHAIN_CUTDOWN mais j'y ai mis les étapes intermédiaires
Le but étant de trouver l'espace qui se situe au niveau ou juste avant le 50ème caractère, d'où le fait de faire une recherche inversé (On part du 50ème caractère et on remonte la chaîne jusqu'au première espace)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 VAR chaine varchar2(100); EXEC :chaine := 'MA TRES LONGUE CHAINE DE CARACTERE A DECOUPER EN DEUX CHAINES DE CARACTERES'; SELECT LENGTH(:chaine) AS LENGTH, GREATEST(LENGTH(:chaine)-50,0) AS REVERSE_CUT, REVERSE(:chaine) AS REVERSE_CHAIN, INSTR( REVERSE(:chaine), ' ', GREATEST(LENGTH(:chaine)-50,0) ) AS SPACE_REVERSED_POSITION, LENGTH(SUBSTR( :chaine, 0, LENGTH(:chaine)-INSTR(REVERSE(:chaine),' ',GREATEST(LENGTH(:chaine)-50,0)) )) AS LENGTH_CHAIN_CUTDOWN, SUBSTR( :chaine, 0, LENGTH(:chaine)-INSTR(REVERSE(:chaine),' ',GREATEST(LENGTH(:chaine)-50,0)) ) AS CHAIN_CUTDOWN FROM DUAL; LENGTH ---------- 75 REVERSE_CUT ----------- 25 REVERSE_CHAIN -------------------------------------------------------------------------------- SERETCARAC ED SENIAHC XUED NE REPUOCED A ERETCARAC ED ENIAHC EUGNOL SERT AM SPACE_REVERSED_POSITION ----------------------- 27 LENGTH_CHAIN_CUTDOWN -------------------- 48 CHAIN_CUTDOWN -------------------------------------------------------------------------------- MA TRES LONGUE CHAINE DE CARACTERE A DECOUPER EN
Le -50 va te donner la plus grande chaine en deuxième partie.
Pour l'avoir en première partie, il suffit de récupérer le dernier espace de la chaine tronquée à 50 car
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT SUBSTR(chaine, 1, INSTR(SUBSTR(chaine,1,50), ' ', -1)) par1, SUBSTR(chaine, INSTR(SUBSTR(chaine,1,50), ' ', -1)+1) par2 FROM (SELECT 'MA TRES LONGUE CHAINE DE CARACTERE A DECOUPER EN DEUX CHAINES DE CARACTERES' AS chaine FROM dual) PAR1 : MA TRES LONGUE CHAINE DE CARACTERE A DECOUPER EN PAR2 : DEUX CHAINES DE CARACTERES
J'ajoute la solution Ô combien plus simple de Mnitu
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 var chaine VARCHAR2(100); exec :chaine := 'MA TRES LONGUE CHAINE DE CARACTERE A DECOUPER EN DEUX CHAINES DE CARACTERES'; SELECT LENGTH(SUBSTR(:chaine,0,INSTR(:chaine,' ',50-LENGTH(:chaine)))) AS CUTDOWN_POSITION, SUBSTR(:chaine,0,INSTR(:chaine,' ',50-LENGTH(:chaine))) AS CHAIN_CUTDOWN FROM dual; CUTDOWN_POSITION CHAIN_CUTDOWN ---------------- -------------------------------------------------- 49 MA TRES LONGUE CHAINE DE CARACTERE A DECOUPER EN
Partager