Discussione:
Estrarre numeri da stringa
(troppo vecchio per rispondere)
Bruno Campanini
2024-03-07 23:22:07 UTC
Permalink
Si riesce, con FORMULA, a estrarre i numeri dalla stringa che segue?
Il punto "." è SOLO separatore decimale.
Se si usa come separatore decimale la virgola ","
occorrerà fare le opportune inversioni.

"q w-4574,fgh67.83fgh77 afd7mbn 908 125.47abc"

Bruno
casanmaner
2024-03-08 16:01:00 UTC
Permalink
Post by Bruno Campanini
Si riesce, con FORMULA, a estrarre i numeri dalla stringa che segue?
Il punto "." è SOLO separatore decimale.
Se si usa come separatore decimale la virgola ","
occorrerà fare le opportune inversioni.
"q  w-4574,fgh67.83fgh77 afd7mbn  908 125.47abc"
Bruno
Ciao Bruno,
senza alcune formule di 365 credo sia molto complesso riuscire ad
estrarre tutti i numeri (compresi quelli con decimale).
Con 365 ho inventato questa formula:

=--DIVIDI.TESTO(ANNULLA.SPAZI(SOSTITUISCI(CONCAT(SE.ERRORE(--SOSTITUISCI(STRINGA.ESTRAI(A1;SEQUENZA(1;LUNGHEZZA(A1));1);",";RIPETI("99999";LUNGHEZZA(A1)));"
"));"1E+230";","));" ")

che mi restituisce, per la stringa "q w-4574.fgh67,83fgh77 afd7mbn 908
125,47abc" (dove ho invertito la virgola con il punto), questi valori:

Loading Image...

ciao
casanmaner
2024-03-08 16:06:22 UTC
Permalink
Post by casanmaner
Post by Bruno Campanini
Si riesce, con FORMULA, a estrarre i numeri dalla stringa che segue?
Il punto "." è SOLO separatore decimale.
Se si usa come separatore decimale la virgola ","
occorrerà fare le opportune inversioni.
"q  w-4574,fgh67.83fgh77 afd7mbn  908 125.47abc"
Bruno
Ciao Bruno,
senza alcune formule di 365 credo sia molto complesso riuscire ad
estrarre tutti i numeri (compresi quelli con decimale).
=--DIVIDI.TESTO(ANNULLA.SPAZI(SOSTITUISCI(CONCAT(SE.ERRORE(--SOSTITUISCI(STRINGA.ESTRAI(A1;SEQUENZA(1;LUNGHEZZA(A1));1);",";RIPETI("99999";LUNGHEZZA(A1)));" "));"1E+230";","));" ")
che mi restituisce, per la stringa "q  w-4574.fgh67,83fgh77 afd7mbn  908
https://www.dropbox.com/scl/fi/8n14xq5n0yjl3jpixc1sl/Screenshot-2024-03-08-16.59.38.png?rlkey=x08av14ynvgcikk8kcv7afr3n&dl=0
ciao
Però dà errore se è presente il 9 :)
Occorre trovare un'altra soluzine per intercettare i decimali :)
casanmaner
2024-03-08 16:09:54 UTC
Permalink
q  w-4574.fgh67,83fgh77 afd7mbn  908 125,47abc
Il problema è nella scelta di parametrare i valori da sostituire per la
virgola alla lunghezza della stringa.
Ora provo a impostare un numero fisso anche se particolarmente grande
casanmaner
2024-03-08 16:12:08 UTC
Permalink
Post by casanmaner
Post by casanmaner
Post by Bruno Campanini
Si riesce, con FORMULA, a estrarre i numeri dalla stringa che segue?
Il punto "." è SOLO separatore decimale.
Se si usa come separatore decimale la virgola ","
occorrerà fare le opportune inversioni.
"q  w-4574,fgh67.83fgh77 afd7mbn  908 125.47abc"
Bruno
Ciao Bruno,
senza alcune formule di 365 credo sia molto complesso riuscire ad
estrarre tutti i numeri (compresi quelli con decimale).
=--DIVIDI.TESTO(ANNULLA.SPAZI(SOSTITUISCI(CONCAT(SE.ERRORE(--SOSTITUISCI(STRINGA.ESTRAI(A1;SEQUENZA(1;LUNGHEZZA(A1));1);",";RIPETI("99999";LUNGHEZZA(A1)));" "));"1E+230";","));" ")
che mi restituisce, per la stringa "q  w-4574.fgh67,83fgh77 afd7mbn
908 125,47abc" (dove ho invertito la virgola con il punto), questi
https://www.dropbox.com/scl/fi/8n14xq5n0yjl3jpixc1sl/Screenshot-2024-03-08-16.59.38.png?rlkey=x08av14ynvgcikk8kcv7afr3n&dl=0
ciao
Però dà errore se è presente il 9 :)
Occorre trovare un'altra soluzine per intercettare i decimali :)
Così dovrebbe andare meglio:

=--DIVIDI.TESTO(ANNULLA.SPAZI(SOSTITUISCI(CONCAT(SE.ERRORE(--SOSTITUISCI(STRINGA.ESTRAI(A1;SEQUENZA(1;LUNGHEZZA(A1));1);",";RIPETI("9";1000));"
"));RIPETI("9";1000);","));" ")
casanmaner
2024-03-08 16:17:45 UTC
Permalink
Post by casanmaner
Post by casanmaner
Post by Bruno Campanini
Si riesce, con FORMULA, a estrarre i numeri dalla stringa che segue?
Il punto "." è SOLO separatore decimale.
Se si usa come separatore decimale la virgola ","
occorrerà fare le opportune inversioni.
"q  w-4574,fgh67.83fgh77 afd7mbn  908 125.47abc"
Bruno
Ciao Bruno,
senza alcune formule di 365 credo sia molto complesso riuscire ad
estrarre tutti i numeri (compresi quelli con decimale).
=--DIVIDI.TESTO(ANNULLA.SPAZI(SOSTITUISCI(CONCAT(SE.ERRORE(--SOSTITUISCI(STRINGA.ESTRAI(A1;SEQUENZA(1;LUNGHEZZA(A1));1);",";RIPETI("99999";LUNGHEZZA(A1)));" "));"1E+230";","));" ")
che mi restituisce, per la stringa "q  w-4574.fgh67,83fgh77 afd7mbn
908 125,47abc" (dove ho invertito la virgola con il punto), questi
https://www.dropbox.com/scl/fi/8n14xq5n0yjl3jpixc1sl/Screenshot-2024-03-08-16.59.38.png?rlkey=x08av14ynvgcikk8kcv7afr3n&dl=0
ciao
Però dà errore se è presente il 9 :)
Occorre trovare un'altra soluzine per intercettare i decimali :)
=--DIVIDI.TESTO(ANNULLA.SPAZI(SOSTITUISCI(CONCAT(SE.ERRORE(--SOSTITUISCI(STRINGA.ESTRAI(A1;SEQUENZA(1;LUNGHEZZA(A1));1);",";RIPETI("9";1000));" "));RIPETI("9";1000);","));" ")
No! ... non va bene nemmeno così.

Riproviamo :-)
=--DIVIDI.TESTO(ANNULLA.SPAZI(SOSTITUISCI(CONCAT(SE.ERRORE(--SOSTITUISCI(STRINGA.ESTRAI(A1;SEQUENZA(1;LUNGHEZZA(A1));1);",";--RIPETI(9;255));"
"));--RIPETI(9;255);","));" ")
casanmaner
2024-03-08 16:24:09 UTC
Permalink
Post by casanmaner
No! ... non va bene nemmeno così.
Riproviamo :-)
=--DIVIDI.TESTO(ANNULLA.SPAZI(SOSTITUISCI(CONCAT(SE.ERRORE(--SOSTITUISCI(STRINGA.ESTRAI(A1;SEQUENZA(1;LUNGHEZZA(A1));1);",";--RIPETI(9;255));" "));--RIPETI(9;255);","));" ")
Questa sembrerebbe fungere:

Loading Image...
Bruno Campanini
2024-03-08 18:27:03 UTC
Permalink
Post by casanmaner
Post by casanmaner
No! ... non va bene nemmeno così.
Riproviamo :-)
=--DIVIDI.TESTO(ANNULLA.SPAZI(SOSTITUISCI(CONCAT(SE.ERRORE(--SOSTITUISCI(STRINGA.ESTRAI(A1;SEQUENZA(1;LUNGHEZZA(A1));1);",";--RIPETI(9;255));"
"));--RIPETI(9;255);","));" ")
https://www.dropbox.com/scl/fi/w1lrtjdwi23yizu6slg9q/Screenshot-2024-03-08-17.23.06.png?rlkey=n2ujladpwzubjlg3rv6ofrwmd&dl=0
Direi che ci siamo... sei un formulista coi fiocchi!

Riesco a leggere la formula, ma non correttamente
la stringa più lunga.
Ho utilizzato Paint ma non ottengo lo zoom.

Comunque, quel RIPETI, in inglese dovrebbe essere REPEAT,
ma nel mio 2021 non c'è.
Sarebbe un parametro che consente il For... Next in formula?

Incredibile, io ho speso 39 righe di codice per ottenere
lo stesso effetto!

Bruno
casanmaner
2024-03-08 18:37:09 UTC
Permalink
Post by Bruno Campanini
Post by casanmaner
Post by casanmaner
No! ... non va bene nemmeno così.
Riproviamo :-)
=--DIVIDI.TESTO(ANNULLA.SPAZI(SOSTITUISCI(CONCAT(SE.ERRORE(--SOSTITUISCI(STRINGA.ESTRAI(A1;SEQUENZA(1;LUNGHEZZA(A1));1);",";--RIPETI(9;255));" "));--RIPETI(9;255);","));" ")
https://www.dropbox.com/scl/fi/w1lrtjdwi23yizu6slg9q/Screenshot-2024-03-08-17.23.06.png?rlkey=n2ujladpwzubjlg3rv6ofrwmd&dl=0
Direi che ci siamo... sei un formulista coi fiocchi!
Riesco a leggere la formula, ma non correttamente
la stringa più lunga.
Ho utilizzato Paint ma non ottengo lo zoom.
Comunque, quel RIPETI, in inglese dovrebbe essere REPEAT,
ma nel mio 2021 non c'è.
Sarebbe un parametro che consente il For... Next in formula?
Dovrebbe essere REPT in inglese.

Corrispone alla funzione VBA "String" e ripente un tot di volte un
carattere.

L'ho utilizzato per sostituire al separatore dei decimali un numero
infinitamente grade per poi, a sua volta, sostituire tale numero con il
separatore di decimale.
Nel caso specifico ho ripetuto il 9 per 255 volte avendo quindi:
999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999


ciao
casanmaner
2024-03-08 18:43:13 UTC
Permalink
In inglese la formula dovrebbe essere questa:

=--TEXTSPLIT(TRIM(SUBSTITUTE(CONCAT(IFERROR(--SUBSTITUTE(MID(A1,SEQUENZA(1,LEN(A1)),1),",",--REPT(9,255)),"
")),--REPT(9,255),","))," ")

provabilmente la funzione TEXTSPLIT è presente solo per Office 365.

Si potrebbe utilizzare, per Excel da 2019, FILTRO.XML nel caso

ciao
casanmaner
2024-03-08 18:51:59 UTC
Permalink
=--TEXTSPLIT(TRIM(SUBSTITUTE(CONCAT(IFERROR(--SUBSTITUTE(MID(A1,SEQUENZA(1,LEN(A1)),1),",",--REPT(9,255))," ")),--REPT(9,255),","))," ")
provabilmente la funzione TEXTSPLIT è presente solo per Office 365.
Si potrebbe utilizzare, per Excel da 2019, FILTRO.XML nel caso
ciao
Questa dovrebbe funzionare anche con la versione 2021

=TRANSPOSE(FILTERXML("<t><s>"&SUBSTITUTE(TRIM(SUBSTITUTE(CONCAT(IFERROR(--SUBSTITUTE(MID(A1,SEQUENCE(1,LEN(A1)),1),",",--REPT(9,255)),"
")),--REPT(9,255),","))," ","</s><s>")&"</s></t>","//s"))
Bruno Campanini
2024-03-08 23:59:29 UTC
Permalink
Post by casanmaner
Post by casanmaner
=--TEXTSPLIT(TRIM(SUBSTITUTE(CONCAT(IFERROR(--SUBSTITUTE(MID(A1,SEQUENZA(1,LEN(A1)),1),",",--REPT(9,255)),"
")),--REPT(9,255),","))," ")
provabilmente la funzione TEXTSPLIT è presente solo per Office 365.
Si potrebbe utilizzare, per Excel da 2019, FILTRO.XML nel caso
ciao
Questa dovrebbe funzionare anche con la versione 2021
=TRANSPOSE(FILTERXML("<t><s>"&SUBSTITUTE(TRIM(SUBSTITUTE(CONCAT(IFERROR(--SUBSTITUTE(MID(A1,SEQUENCE(1,LEN(A1)),1),",",--REPT(9,255)),"
")),--REPT(9,255),","))," ","</s><s>")&"</s></t>","//s"))
C'è solo un risultato che non va: il primo numero della stringa
esempio è 4574 senza virgola.

Bruno
casanmaner
2024-03-09 06:40:11 UTC
Permalink
Post by Bruno Campanini
Post by casanmaner
=--TEXTSPLIT(TRIM(SUBSTITUTE(CONCAT(IFERROR(--SUBSTITUTE(MID(A1,SEQUENZA(1,LEN(A1)),1),",",--REPT(9,255))," ")),--REPT(9,255),","))," ")
provabilmente la funzione TEXTSPLIT è presente solo per Office 365.
Si potrebbe utilizzare, per Excel da 2019, FILTRO.XML nel caso
ciao
Questa dovrebbe funzionare anche con la versione 2021
=TRANSPOSE(FILTERXML("<t><s>"&SUBSTITUTE(TRIM(SUBSTITUTE(CONCAT(IFERROR(--SUBSTITUTE(MID(A1,SEQUENCE(1,LEN(A1)),1),",",--REPT(9,255))," ")),--REPT(9,255),","))," ","</s><s>")&"</s></t>","//s"))
C'è solo un risultato che non va: il primo numero della stringa
esempio è  4574  senza virgola.
Bruno
Ciao Bruno,
potrebbe dipendere dal fatto che nella stringa di testo ho "invertito"
il punto con la virgola e viceversa?
E che nella formula tradotta in inglese, e con la stringa originaria,
andrebbero sostituiti i riferimenti "," con "."?

Io ottengo 4574 senza virgola:
Loading Image...

Se ci fossero numeri con separatori di migliaia (in italiano con il
punto) per gestirli ho effettuato una prima sostituzione del separatore
con un vuoto:

=MATR.TRASPOSTA(FILTRO.XML("<t><s>"&SOSTITUISCI(ANNULLA.SPAZI(SOSTITUISCI(CONCAT(SE.ERRORE(--SOSTITUISCI(STRINGA.ESTRAI(SOSTITUISCI(A1;".";"");SEQUENZA(1;LUNGHEZZA(A1));1);",";--RIPETI(9;255));"
"));--RIPETI(9;255);","));" ";"</s><s>")&"</s></t>";"//s"))

ciao
issdr
2024-03-08 21:01:59 UTC
Permalink
Post by Bruno Campanini
Si riesce, con FORMULA, a estrarre i numeri dalla stringa che segue?
Il punto "." è SOLO separatore decimale.
Se si usa come separatore decimale la virgola ","
occorrerà fare le opportune inversioni.
"q w-4574,fgh67.83fgh77 afd7mbn 908 125.47abc"
Bruno, nell'esempio, essendo separatore decimale il punto, che numero
dovrei tirar fuori essendocene due?

365; nel caso considerassimo la sola virgola presente, ho questa
soluzione, il "motore" è STRINGA.ESTRAI. Stringa, ma convertirla in
numero è marchiano (nel caso specifico alcuni decimali in coda perdono
significatività)

=LET(str;STRINGA.ESTRAI(A1;SEQUENZA(LUNGHEZZA(A1));1);
numeri;FILTRO(str;VAL.NUMERO(NUMERO.VALORE(str;"."))*(str<>" "));
TESTO.UNISCI("";VERO;numeri))
Bruno Campanini
2024-03-08 23:35:15 UTC
Permalink
Post by issdr
Post by Bruno Campanini
Si riesce, con FORMULA, a estrarre i numeri dalla stringa che segue?
Il punto "." è SOLO separatore decimale.
Se si usa come separatore decimale la virgola ","
occorrerà fare le opportune inversioni.
"q w-4574,fgh67.83fgh77 afd7mbn 908 125.47abc"
Bruno, nell'esempio, essendo separatore decimale il punto, che numero
dovrei tirar fuori essendocene due?
Tutti e due!
Se si considerano numeri col solo eventuale separaore decimale ".",
il risultato doverbbe essere questo:
4574 67.83 77 7 908 125.45
Ora che mi ci fai pensare, i numeri hanno anche eventuali
separatori di migliaia: dovrò aggiornare il mio codice.
E già che ci siamo io (ENG) sto con la maggioranza (ITA); suggerite
casanmaner e tu quali separatori decimali e di migliaia.
Post by issdr
365; nel caso considerassimo la sola virgola presente, ho questa
soluzione, il "motore" è STRINGA.ESTRAI. Stringa, ma convertirla in
numero è marchiano (nel caso specifico alcuni decimali in coda perdono
significatività)
=LET(str;STRINGA.ESTRAI(A1;SEQUENZA(LUNGHEZZA(A1));1);
numeri;FILTRO(str;VAL.NUMERO(NUMERO.VALORE(str;"."))*(str<>" "));
TESTO.UNISCI("";VERO;numeri))
Provo a convertirla epoi ti dico se ci sono riuscito;
che funzioni lo sai già tu.

Bruno
issdr
2024-03-09 00:31:19 UTC
Permalink
[...]
Post by Bruno Campanini
Post by issdr
Post by Bruno Campanini
"q w-4574,fgh67.83fgh77 afd7mbn 908 125.47abc"
Bruno, nell'esempio, essendo separatore decimale il punto, che numero
dovrei tirar fuori essendocene due?
Tutti e due!
Se si considerano numeri col solo eventuale separaore decimale ".",
4574 67.83 77 7 908 125.45
ok, chiaro.

=DIVIDI.TESTO(A1;
STACK.VERT(CODICE.CARATT(SEQUENZA(45;;1));
"/";
CODICE.CARATT(SEQUENZA(69;;58)));
;VERO;;)

mi sono limitato ai caratteri ASCII.

per i separatori di migliaia, basta escluderli dalla pila dei
separatori.

purtroppo dubito che questa funzioni in 2021.

ciao
casanmaner
2024-03-09 07:06:31 UTC
Permalink
Post by issdr
STACK.VERT(CODICE.CARATT(SEQUENZA(45;;1));
"/";
CODICE.CARATT(SEQUENZA(69;;58)))
L'ho provata con una stringa in "italiano", considerando i punti come
separatori di migliatia e le vergole di decimali (q
w-4574.fgh67,83fgh77 afd7mbn 908 125,47abc1.235,67ccc) e modificando
per escludere come separatore la virgola e considerare il punto:

Per arrivare al medesimo risultato l'ho adattata così:

=--SOSTITUISCI(DIVIDI.TESTO(A1;STACK.VERT(CODICE.CARATT(SEQUENZA(43;;1));"-";"/";CODICE.CARATT(SEQUENZA(69;;58)));;VERO);".";"")


Senza l'adattamento per il primo numero "4574" sarebbe seguito il punto
"4574."
casanmaner
2024-03-09 07:19:03 UTC
Permalink
Post by casanmaner
Post by issdr
STACK.VERT(CODICE.CARATT(SEQUENZA(45;;1));
                          "/";
                          CODICE.CARATT(SEQUENZA(69;;58)))
L'ho provata con una stringa in "italiano", considerando i punti come
separatori di migliatia e le vergole di decimali (q w-4574.fgh67,83fgh77
afd7mbn  908 125,47abc1.235,67ccc) e modificando per escludere come
=--SOSTITUISCI(DIVIDI.TESTO(A1;STACK.VERT(CODICE.CARATT(SEQUENZA(43;;1));"-";"/";CODICE.CARATT(SEQUENZA(69;;58)));;VERO);".";"")
Senza l'adattamento per il primo numero "4574" sarebbe seguito il punto
"4574."
Il "problema" con una stringa di questo tipo:

q w-4574.fgh67,83fgh77 afd7mbn 908 125,47abc1.235,67cccaskdlfj adfj
.ad.sfad12

è che crea due campi vuoti in corrispondenza dei due punti nel finale
della stringa
casanmaner
2024-03-09 07:19:54 UTC
Permalink
Post by casanmaner
Post by issdr
STACK.VERT(CODICE.CARATT(SEQUENZA(45;;1));
                          "/";
                          CODICE.CARATT(SEQUENZA(69;;58)))
L'ho provata con una stringa in "italiano", considerando i punti come
separatori di migliatia e le vergole di decimali (q
w-4574.fgh67,83fgh77 afd7mbn  908 125,47abc1.235,67ccc) e modificando
=--SOSTITUISCI(DIVIDI.TESTO(A1;STACK.VERT(CODICE.CARATT(SEQUENZA(43;;1));"-";"/";CODICE.CARATT(SEQUENZA(69;;58)));;VERO);".";"")
Senza l'adattamento per il primo numero "4574" sarebbe seguito il
punto "4574."
q  w-4574.fgh67,83fgh77 afd7mbn  908 125,47abc1.235,67cccaskdlfj  adfj
.ad.sfad12
è che crea due campi vuoti in corrispondenza dei due punti nel finale
della stringa
Loading Image...
Bruno Campanini
2024-03-09 12:15:45 UTC
Permalink
Post by casanmaner
Post by casanmaner
Post by issdr
STACK.VERT(CODICE.CARATT(SEQUENZA(45;;1));
                          "/";
                          CODICE.CARATT(SEQUENZA(69;;58)))
L'ho provata con una stringa in "italiano", considerando i punti come
separatori di migliatia e le vergole di decimali (q w-4574.fgh67,83fgh77
afd7mbn  908 125,47abc1.235,67ccc) e modificando per escludere come
=--SOSTITUISCI(DIVIDI.TESTO(A1;STACK.VERT(CODICE.CARATT(SEQUENZA(43;;1));"-";"/";CODICE.CARATT(SEQUENZA(69;;58)));;VERO);".";"")
Senza l'adattamento per il primo numero "4574" sarebbe seguito il punto
"4574."
q  w-4574.fgh67,83fgh77 afd7mbn  908 125,47abc1.235,67cccaskdlfj  adfj
.ad.sfad12
è che crea due campi vuoti in corrispondenza dei due punti nel finale della
stringa
https://www.dropbox.com/scl/fi/e5d06ksmzw2209qyreg7s/Screenshot-2024-03-09-08.19.26.png?rlkey=97pjfsyl4q0px5tk83h9m4gfy&dl=0
Può darsi che la virgola venga considerata alla stregua
delle Reserved Words.
Infatti in VBA riesco a controllare correttamente Space(1)
come separatore di migliaia e separatore di elementi,
e il punto come separatore decimale.
Ma non son proprio riuscito a controllare la virgola come
separatore numerico.

Prova a sostituire la virgola come separatore di migliaia
con altro carattere tipo "|" per verificare quanto sopra detto.
Lo farò anch'io poi ti dirò.

Bruno
issdr
2024-03-09 10:03:13 UTC
Permalink
Post by casanmaner
L'ho provata con una stringa in "italiano", considerando i punti come
separatori di migliatia e le vergole di decimali (q
w-4574.fgh67,83fgh77 afd7mbn 908 125,47abc1.235,67ccc) e modificando
[...]

ok, ho pensato che i delimitatori delle migliaia e dei decimali fossero
da considerare come tali e basta, ovvero non potessero rientrare nello
"sporco". ho provato rapidamente la formula nell'immagine condivisa, ci
torno quando ho un po' di tranquillità, intanto grazie.

ciao
issdr
2024-03-09 20:19:19 UTC
Permalink
issdr wrote:


[...]
Post by issdr
=DIVIDI.TESTO(A1;
STACK.VERT(CODICE.CARATT(SEQUENZA(45;;1));
"/";
CODICE.CARATT(SEQUENZA(69;;58)));
;VERO;;)
mi sono limitato ai caratteri ASCII.
una versione più leggibile di questa sopra, estendendo il "pettine" a
255 caratteri meno le cifre e il separatore decimale:

=LET(seq;SEQUENZA(255);
pila;FILTRO(CODICE.CARATT(seq);
((seq<CODICE("0"))+(seq>CODICE("9")))*
(seq<>CODICE(".")));
DIVIDI.TESTO(A1;pila;;VERO))
Bruno Campanini
2024-03-09 21:23:07 UTC
Permalink
Post by issdr
[...]
Post by issdr
=DIVIDI.TESTO(A1;
STACK.VERT(CODICE.CARATT(SEQUENZA(45;;1));
"/";
CODICE.CARATT(SEQUENZA(69;;58)));
;VERO;;)
mi sono limitato ai caratteri ASCII.
una versione più leggibile di questa sopra, estendendo il "pettine" a
=LET(seq;SEQUENZA(255);
pila;FILTRO(CODICE.CARATT(seq);
((seq<CODICE("0"))+(seq>CODICE("9")))*
(seq<>CODICE(".")));
DIVIDI.TESTO(A1;pila;;VERO))
Mi piacerebbe vederla in funzione ma da me non va.
Io questa:

"q w-4574,fgh67.83fgh77 afd7mbn 908 125.47abc"

la risolvo così:
4574 67.83 77 7 908125.47

Separatore di migliaia e di elementi Space(1),
separatore decimale "."

Non sono riuscito a ricevere l'ultimo numero nel
formato in cui si trova nella stringa, cioè coi
separatori mille/decimali.
Ma ci riproverò.

Bruno
issdr
2024-03-09 23:05:16 UTC
Permalink
[...]
Post by Bruno Campanini
Post by issdr
=LET(seq;SEQUENZA(255);
pila;FILTRO(CODICE.CARATT(seq);
((seq<CODICE("0"))+(seq>CODICE("9")))*
(seq<>CODICE(".")));
DIVIDI.TESTO(A1;pila;;VERO))
Mi piacerebbe vederla in funzione ma da me non va.
"q w-4574,fgh67.83fgh77 afd7mbn 908 125.47abc"
https://user.fm/files/v2-6c1c0dd31c99e302627ae344f38a9459/RPReplay_Final1710025164.mp4
Post by Bruno Campanini
4574 67.83 77 7 908125.47
Separatore di migliaia e di elementi Space(1),
separatore decimale "."
Non sono riuscito a ricevere l'ultimo numero nel
formato in cui si trova nella stringa, cioè coi
separatori mille/decimali.
Ma ci riproverò.
VBA? escludi l'uso delle regex? risolvi facilmente con le parentesi
tonde, capturing groups.
issdr
2024-03-11 22:10:04 UTC
Permalink
Post by Bruno Campanini
"q w-4574,fgh67.83fgh77 afd7mbn 908 125.47abc"
4574 67.83 77 7 908125.47
Separatore di migliaia e di elementi Space(1),
separatore decimale "."
Non sono riuscito a ricevere l'ultimo numero nel
formato in cui si trova nella stringa, cioè coi
separatori mille/decimali.
- copia la stringa di prova in memoria
- apri poweshell
- incollala con un click destro (deve avere le doppie virgolette
all'inizio e alla fine, in questo modo viene vista come oggetto
stringa)
- digita uno spazio e poi incollaci -replace '\D*(\d+(\.\d+)*\D+',"`$1`n"
- puoi selezionare il risultato e premere invio (lo avrai in memoria,
pronto da incollare su foglio)

in alternativa, si può gestire il copincolla anche direttamente da linea
di comando; copi la stringa in memoria (senza virgolette), poi:

gcb | %{$_ -replace '\D*(\d+(\.\d+)*)\D*',"`$1`n"} | scb

avrai in memoria il risultato da incollare dove vuoi.

quando riaprirai powershell, il comando sarà nello storico, basta che
torni ai comandi precedenti con Freccia Su.

il VBA, con commento alla regex utilizzata:

--8<---------------cut here---------------start------------->8---
Function TrovaNumeri(stringa As String) As Variant
Dim numeri As String

Const sep = "."
stringa = Replace(stringa, IIf(sep = ".", ",", "."), "")

With CreateObject("vbscript.regexp")
.Pattern = "\D*(\d+(?:\" & sep & "\d+)?)\D*"
Rem _
\D indica un *non* numerico _
\d indica un numerico _
+ sta per 1 o N precedenti _
* sta per 0 o N precedenti _
? sta per 0 o 1 precedenti _
le () raggruppano una regola e catturano il risultato _
?: all'inizio delle () "spegne" la funzione di cattura.
.Global = True
numeri = .Replace(stringa, "$1 ")
'$1 contengono (opz. global, piu` match possibili) i gruppi catturati.
End With

TrovaNumeri = Split(Trim$(numeri), " ")

End Function
--8<---------------cut here---------------end--------------->8---

late binding, non devi spuntare alcuna libreria.
issdr
2024-03-11 22:32:16 UTC
Permalink
Post by issdr
- digita uno spazio e poi incollaci -replace '\D*(\d+(\.\d+)*\D+',"`$1`n"
la regex giusta è nel VBA, questa sopra ha due refusi. \D*(\d+(\.\d+)?\D*
è quella giusta.

casanmaner
2024-03-10 08:10:58 UTC
Permalink
Post by issdr
[...]
Post by issdr
=DIVIDI.TESTO(A1;
STACK.VERT(CODICE.CARATT(SEQUENZA(45;;1));
"/";
CODICE.CARATT(SEQUENZA(69;;58)));
;VERO;;)
mi sono limitato ai caratteri ASCII.
una versione più leggibile di questa sopra, estendendo il "pettine" a
=LET(seq;SEQUENZA(255);
pila;FILTRO(CODICE.CARATT(seq);
((seq<CODICE("0"))+(seq>CODICE("9")))*
(seq<>CODICE(".")));
DIVIDI.TESTO(A1;pila;;VERO))
Molto bella.
L'ho adattata in LAMBDA con possibilità di scelta dei separatori di
migliaia e decimali.

=LAMBDA(sTesto;sSeparatoreDecimali;sSeparatoreMigliaia;
LET(seq;SEQUENZA(255);

pila;FILTRO(CODICE.CARATT(seq);((seq<CODICE("0"))+(seq>CODICE("9")))*(seq<>CODICE(sSeparatoreDecimali)));

DIVIDI.TESTO(SOSTITUISCI(sTesto;sSeparatoreMigliaia;"");pila;;VERO)))(A1;".";",")

In questo modo se la stringa fosse:
q w-4574,fgh67.83fgh77 afd7mbn 908 125.47abc cccc 1,356.69

l'ultimo numero "1,356.69" non verrebbe suddiviso tra 1 e 356.69 ma
diventerebbe 1356.69

Invertendo i separatori diventerebbe immediato l'utilizzo per stringe e
numeri in formato italiano.

Ora me la salvo nel personal :)
issdr
2024-03-10 09:31:56 UTC
Permalink
Post by casanmaner
L'ho adattata in LAMBDA con possibilità di scelta dei separatori di
migliaia e decimali.
forte!
Loading...