Discussione:
estrapolare un dato da una stringa inusuale
(troppo vecchio per rispondere)
Final Job
2024-03-26 18:59:00 UTC
Permalink
Buonasera
In un campo di una tabella compare, con una certa ricorrenza, la
seguente stringa:

Regione - Provincia - Città

<br><span class="Consistenza-Tabella"> Consistenza del 10,00 %</span>

Come si nota, tra la prima parte della stringa e la seconda compare,
nella stessa cella, un salto "a capo" vuoto e poi un ulteriore salto "a
capo" contenente la seconda stringa.

Devo estrarre, da ogni cella del genere, il solo valore numerico
percentuale (che può essere con o senza decimale e con una, due o tre
cifre intere).

Ulteriore particolarità è che a volte il valore interessato compare come
"del10,00%"
altre volte come
"del 10%"
oppure
"del 10,00 %</ span>"

Non posso normalizzare tutte le celle di questo genere quindi ... mi ci
sono impantanato. Suggerimenti, per caso?
Grazie
Ale
casanmaner
2024-03-26 19:22:00 UTC
Permalink
Post by Final Job
Regione - Provincia - Città
<br><span class="Consistenza-Tabella"> Consistenza del 10,00 %</span>
Questa formula dovrebbe estrarre il valore:

=--SOSTITUISCI(SOSTITUISCI(STRINGA.ESTRAI(A1;TROVA("Consistenza
del";A1)+LUNGHEZZA("Consistenza del");LUNGHEZZA(A1));"</span>";"");" ";"")

ma andrebbe poi integrata con le possibili altre ipotesi di testo,
magari con un SE.ERRORE per scegliere un'altra formula o altro.
Final Job
2024-03-26 22:00:52 UTC
Permalink
Post by casanmaner
=--SOSTITUISCI(SOSTITUISCI(STRINGA.ESTRAI(A1;TROVA("Consistenza
del";A1)+LUNGHEZZA("Consistenza del");LUNGHEZZA(A1));"</span>";"");" ";"")
ma andrebbe poi integrata con le possibili altre ipotesi di testo,
magari con un SE.ERRORE per scegliere un'altra formula o altro.
ok
grazie
Ale
Final Job
2024-03-28 23:32:49 UTC
Permalink
Post by casanmaner
Post by Final Job
Regione - Provincia - Città
<br><span class="Consistenza-Tabella"> Consistenza del 10,00 %</span>
=--SOSTITUISCI(SOSTITUISCI(STRINGA.ESTRAI(A1;TROVA("Consistenza
del";A1)+LUNGHEZZA("Consistenza del");LUNGHEZZA(A1));"</span>";"");" ";"")
ma andrebbe poi integrata con le possibili altre ipotesi di testo,
magari con un SE.ERRORE per scegliere un'altra formula o altro.
Ho applicato la formula. Funziona ma ci sono parecchi records per i
quali la formula non da risultato. Al presente link un esempio, sperando
che venga riprodotto correttamente.

https://www.dropbox.com/scl/fi/9ssao94vs9qdeqp3nyqm2/estrapolare-un-dato-da-una-stringa-inusuale-funzionamento.xlsx?rlkey=o4qbk949kaixdh9m0rosq94kd&dl=0

Grazie
Ale
casanmaner
2024-03-29 06:52:29 UTC
Permalink
Post by Final Job
Post by casanmaner
Post by Final Job
Regione - Provincia - Città
<br><span class="Consistenza-Tabella"> Consistenza del 10,00 %</span>
=--SOSTITUISCI(SOSTITUISCI(STRINGA.ESTRAI(A1;TROVA("Consistenza
del";A1)+LUNGHEZZA("Consistenza del");LUNGHEZZA(A1));"</span>";"");" ";"")
ma andrebbe poi integrata con le possibili altre ipotesi di testo,
magari con un SE.ERRORE per scegliere un'altra formula o altro.
Ho applicato la formula. Funziona ma ci sono parecchi records per i
quali la formula non da risultato. Al presente link un esempio, sperando
che venga riprodotto correttamente.
https://www.dropbox.com/scl/fi/9ssao94vs9qdeqp3nyqm2/estrapolare-un-dato-da-una-stringa-inusuale-funzionamento.xlsx?rlkey=o4qbk949kaixdh9m0rosq94kd&dl=0
Grazie
Ale
C'è un carattere di "A capo" presente che disturba l'estrazione.

Prova con

=SE.ERRORE(--SOSTITUISCI(SOSTITUISCI(STRINGA.ESTRAI(SOSTITUISCI(C5;CODICE.CARATT(10);"");TROVA("Consistenza
del";C5)+LUNGHEZZA("Consistenza del");LUNGHEZZA(C5));"</span>";"");"
";"")*100;"")
Final Job
2024-03-29 15:05:39 UTC
Permalink
Post by casanmaner
C'è un carattere di "A capo" presente che disturba l'estrazione.
Prova con
=SE.ERRORE(--SOSTITUISCI(SOSTITUISCI(STRINGA.ESTRAI(SOSTITUISCI(C5;CODICE.CARATT(10);"");TROVA("Consistenza del";C5)+LUNGHEZZA("Consistenza del");LUNGHEZZA(C5));"</span>";"");" ";"")*100;"")
Buongiorno
anche io avevo notato la differenza di un carattere ma sono dovuto
andare a togliere pian piano pezzi di stringa per arrivare a capire dove
fosse e comunque non risolvendo perchè c'è qualcosa che non capisco a
fondo in quell' "A capo". Come sei arrivato ad individuare la particolarità?

Inoltre, se usi la funzione "Identico" viene rilevata la differenza ma
se vai a rilevare le lunghezze dei singoli campi nel file di esempio con
la funzione "Lunghezza", risulta che le due stringhe sono di pari peso
in caratteri. Come mai?

C'è modo di normalizzare la stringa, aggiungendo un passaggio in una
colonna di appoggio o con una funzione, al fine di togliere eventuali
formattazioni differenti?

In ogni caso, come in questo, non si riesce a tirare fuori il dato
neanche applicando la nuova formula.
Buon pomeriggio
Ale
casanmaner
2024-03-29 15:51:54 UTC
Permalink
Post by Final Job
Buongiorno
anche io avevo notato la differenza di un carattere ma sono dovuto
andare a togliere pian piano pezzi di stringa per arrivare a capire dove
fosse e comunque non risolvendo perchè c'è qualcosa che non capisco a
fondo in quell' "A capo". Come sei arrivato ad individuare la
particolarità?
Inoltre, se usi la funzione "Identico" viene rilevata la differenza ma
se vai a rilevare le lunghezze dei singoli campi nel file di esempio con
la funzione "Lunghezza", risulta che le due stringhe sono di pari peso
in caratteri. Come mai?
C'è modo di normalizzare la stringa, aggiungendo un passaggio in una
colonna di appoggio o con una funzione, al fine di togliere eventuali
formattazioni differenti?
In ogni caso, come in questo, non si riesce a tirare fuori il dato
neanche applicando la nuova formula.
Probabilmente ero entrato nella cella e dato invio e la formula
riconosceva l'a capo e mi restituiva il valore.
Proviamo una formula differente:

=SOSTITUISCI(SOSTITUISCI(STRINGA.ESTRAI(C5;TROVA("Consistenza
del";C5)+LUNGHEZZA("Consistenza
del")+1;LUNGHEZZA(C5)-TROVA("</span>";C5));" ";"");"%";"")
casanmaner
2024-03-29 15:57:42 UTC
Permalink
Post by casanmaner
=SOSTITUISCI(SOSTITUISCI(STRINGA.ESTRAI(C5;TROVA("Consistenza
del";C5)+LUNGHEZZA("Consistenza
del")+1;LUNGHEZZA(C5)-TROVA("</span>";C5));" ";"");"%";"")
Può andare bene per la prima stringa, ma può dare risultati non esatti
per la seconda
casanmaner
2024-03-29 15:58:23 UTC
Permalink
Post by casanmaner
Post by casanmaner
=SOSTITUISCI(SOSTITUISCI(STRINGA.ESTRAI(C5;TROVA("Consistenza
del";C5)+LUNGHEZZA("Consistenza
del")+1;LUNGHEZZA(C5)-TROVA("</span>";C5));" ";"");"%";"")
Può andare bene per la prima stringa, ma può dare risultati non esatti
per la seconda
E anche per la prima .... da rivedere
casanmaner
2024-03-29 16:12:13 UTC
Permalink
Nuovo tentativo :-)

=SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(C5;"
";"");CODICE.CARATT(10);"");SINISTRA(SOSTITUISCI(SOSTITUISCI(C5;"
";"");CODICE.CARATT(10);"");TROVA("Consistenzadel";SOSTITUISCI(SOSTITUISCI(C5;"
";"");CODICE.CARATT(10);""))+LUNGHEZZA("Consistenzadel")-1);"");"</span>";"");"%";"")
Final Job
2024-03-29 16:28:48 UTC
Permalink
Post by casanmaner
=SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(C5;"
";"");CODICE.CARATT(10);"");SINISTRA(SOSTITUISCI(SOSTITUISCI(C5;"
";"");CODICE.CARATT(10);"");TROVA("Consistenzadel";SOSTITUISCI(SOSTITUISCI(C5;" ";"");CODICE.CARATT(10);""))+LUNGHEZZA("Consistenzadel")-1);"");"</span>";"");"%";"")
niente, evidentemente è un caso di quelli che fanno perdere tempo e
basta quindi cerco di fare in altro modo. Stai tranquillo. Non è un
grosso problema.
Ti ringrazio
Ale
casanmaner
2024-03-29 16:30:47 UTC
Permalink
Post by casanmaner
Nuovo tentativo :-)
=SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(C5;"
";"");CODICE.CARATT(10);"");SINISTRA(SOSTITUISCI(SOSTITUISCI(C5;"
";"");CODICE.CARATT(10);"");TROVA("Consistenzadel";SOSTITUISCI(SOSTITUISCI(C5;" ";"");CODICE.CARATT(10);""))+LUNGHEZZA("Consistenzadel")-1);"");"</span>";"");"%";"")
Con questa riesco ad estrarre dalla prima stringa il numero ma rimane,
alla fine della stringa, un carattere in più che non viene riconosciuto
come "a capo" (codice carattere 10) fino a che non si entra e si
riconferma con invio.

Sembra che occorra utilizzare anche una sostituzione con codice carattere 13

=SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(C5;"
";"");CODICE.CARATT(10);"");SINISTRA(SOSTITUISCI(SOSTITUISCI(C5;"
";"");CODICE.CARATT(10);"");TROVA("Consistenzadel";SOSTITUISCI(SOSTITUISCI(C5;"
";"");CODICE.CARATT(10);""))+LUNGHEZZA("Consistenzadel")-1);"");"</span>";"");"%";"");CODICE.CARATT(13);"")
casanmaner
2024-03-29 16:45:13 UTC
Permalink
Post by casanmaner
Post by casanmaner
Nuovo tentativo :-)
=SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(C5;"
";"");CODICE.CARATT(10);"");SINISTRA(SOSTITUISCI(SOSTITUISCI(C5;"
";"");CODICE.CARATT(10);"");TROVA("Consistenzadel";SOSTITUISCI(SOSTITUISCI(C5;" ";"");CODICE.CARATT(10);""))+LUNGHEZZA("Consistenzadel")-1);"");"</span>";"");"%";"")
Con questa riesco ad estrarre dalla prima stringa il numero ma rimane,
alla fine della stringa, un carattere in più che non viene riconosciuto
come "a capo" (codice carattere 10) fino a che non si entra e si
riconferma con invio.
Sembra che occorra utilizzare anche una sostituzione con codice carattere 13
=SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(C5;" ";"");CODICE.CARATT(10);"");SINISTRA(SOSTITUISCI(SOSTITUISCI(C5;" ";"");CODICE.CARATT(10);"");TROVA("Consistenzadel";SOSTITUISCI(SOSTITUISCI(C5;" ";"");CODICE.CARATT(10);""))+LUNGHEZZA("Consistenzadel")-1);"");"</span>";"");"%";"");CODICE.CARATT(13);"")
Una possibile alternativa se si dispone della funzione LET

=LET(StringaNormalizzata;MINUSC(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(C12;CODICE.CARATT(13);"");CODICE.CARATT(10);"");"
";"");"%";"");"</span>";""));
--SOSTITUISCI(StringaNormalizzata;SINISTRA(StringaNormalizzata;TROVA("consistenzadel";StringaNormalizzata)+LUNGHEZZA("consistenzadel")-1);""))

sulle due stringhe di esempio estrae la stringa del solo numero che non
dà errore se "covertito" in numero (con il doppio meno).
Final Job
2024-03-29 17:29:57 UTC
Permalink
Post by casanmaner
Sembra che occorra utilizzare anche una sostituzione con codice carattere 13
=SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(C5;" ";"");CODICE.CARATT(10);"");SINISTRA(SOSTITUISCI(SOSTITUISCI(C5;" ";"");CODICE.CARATT(10);"");TROVA("Consistenzadel";SOSTITUISCI(SOSTITUISCI(C5;" ";"");CODICE.CARATT(10);""))+LUNGHEZZA("Consistenzadel")-1);"");"</span>";"");"%";"");CODICE.CARATT(13);"")
Excel 2016 non supporta la funzione LET
Penso sia il caso di puntare ad altra soluzione. A meno che una UDF non
risolva meglio.

Comunque grazie mille.
Ale
casanmaner
2024-03-29 18:12:31 UTC
Permalink
Post by Final Job
Post by casanmaner
Sembra che occorra utilizzare anche una sostituzione con codice carattere 13
=SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(SOSTITUISCI(C5;" ";"");CODICE.CARATT(10);"");SINISTRA(SOSTITUISCI(SOSTITUISCI(C5;" ";"");CODICE.CARATT(10);"");TROVA("Consistenzadel";SOSTITUISCI(SOSTITUISCI(C5;" ";"");CODICE.CARATT(10);""))+LUNGHEZZA("Consistenzadel")-1);"");"</span>";"");"%";"");CODICE.CARATT(13);"")
Excel 2016 non supporta la funzione LET
Penso sia il caso di puntare ad altra soluzione. A meno che una UDF non
risolva meglio.
Comunque grazie mille.
Ale
In teoria quella che hai quotato dovrebbe funzionare.
Comunque volendo provare con una FDU, affidandosi alle espressioni
regolari potresti provare con questa e vedere se riesce ad estrarre i numeri


Function EstraiNumero(str As String) As Double
Dim oRegExp As Object
Set oRegExp = CreateObject("VBScript.RegExp")
With oRegExp
.Pattern = "\d{1,},\d{1,}"
.Global = False
If .test(str) Then
EstraiNumero = .Execute(str)(0)
End If
End With
Set oRegExp = Nothing
End Function
issdr
2024-03-29 22:28:52 UTC
Permalink
Post by casanmaner
.Pattern = "\d{1,},\d{1,}"
un patrern più mirato sarebbe "\d{1,2}(,\d+)?"

ovvero: una o due cifre intere (se è previsto il 100% basta mettere il 3
al posto del 2), con gruppo opzionale costituito da virgola e almeno una
cifra.
Final Job
2024-03-30 22:17:43 UTC
Permalink
Post by issdr
Post by casanmaner
.Pattern = "\d{1,},\d{1,}"
un patrern più mirato sarebbe "\d{1,2}(,\d+)?"
ovvero: una o due cifre intere (se è previsto il 100% basta mettere il 3
al posto del 2), con gruppo opzionale costituito da virgola e almeno una
cifra.
Scusa ma non rilevo la differenza nel funzionamento.

Con il pattern della funzione di Casanmaner, sia che il risultato abbia
una, due o tre cifre intere, viene restituito il valore corretto.

Se lo sostituisco con "\d{1,2}(,\d+)?" ho un errore.
Grazie
Final Job
2024-03-30 22:18:51 UTC
Permalink
Post by Final Job
Post by issdr
       .Pattern = "\d{1,},\d{1,}"
un patrern più mirato sarebbe "\d{1,2}(,\d+)?"
ovvero: una o due cifre intere (se è previsto il 100% basta mettere il 3
al posto del 2), con gruppo opzionale costituito da virgola e almeno una
cifra.
Scusa ma non rilevo la differenza nel funzionamento.
Con il pattern della funzione di Casanmaner, sia che il risultato abbia
una, due o tre cifre intere, viene restituito il valore corretto.
Se lo sostituisco con "\d{1,2}(,\d+)?" ho un errore.
Grazie
volevo dire che non mi torna lo scenario
issdr
2024-03-30 23:34:41 UTC
Permalink
Post by Final Job
Se lo sostituisco con "\d{1,2}(,\d+)?" ho un errore.
come ho scritto, se le cifre intere possono essere tre, cambia il 2 in 3

il pattern di casanmaner cattura solo le perfentuali che hanno virgola e
almeno un decimale indicato; il mio acchiappa anche quelle sprovviste di
virgola e decimali.
Final Job
2024-04-01 14:57:24 UTC
Permalink
Post by issdr
Post by Final Job
Se lo sostituisco con "\d{1,2}(,\d+)?" ho un errore.
come ho scritto, se le cifre intere possono essere tre, cambia il 2 in 3
il pattern di casanmaner cattura solo le perfentuali che hanno virgola e
almeno un decimale indicato; il mio acchiappa anche quelle sprovviste di
virgola e decimali.
Avevo sbagliato io ad adattare la funzione.
Scusa
Grazie
Ale
Final Job
2024-04-01 15:11:28 UTC
Permalink
Post by issdr
Post by Final Job
Se lo sostituisco con "\d{1,2}(,\d+)?" ho un errore.
come ho scritto, se le cifre intere possono essere tre, cambia il 2 in 3
il pattern di casanmaner cattura solo le perfentuali che hanno virgola e
almeno un decimale indicato; il mio acchiappa anche quelle sprovviste di
virgola e decimali.
E' ampiamente fuori dalla mia portata ma ho capito che si fa riferimento
al Regular Expression Language. Pur avendo individuato alcune
pubblicazioni in rete che forniscono tabelle esplicative del
funzionamento dei caratteri da voi usati, non individuo come si
estrapola da str la percentuale e proprio quella.
issdr
2024-04-01 15:39:00 UTC
Permalink
Post by Final Job
E' ampiamente fuori dalla mia portata ma ho capito che si fa
riferimento al Regular Expression Language. Pur avendo individuato
alcune pubblicazioni in rete che forniscono tabelle esplicative del
funzionamento dei caratteri da voi usati, non individuo come si
estrapola da str la percentuale e proprio quella.
bisogna entrare nella logica, ma un uso basilare non è complicato.

avevo scritto del codice commentato per Bruno, ma senza che te lo vada a
cercare, qui c'è una guida fatta discretamente in italiano:

http://www.ndp77.net/dnld/Spadaccini_Regexp.pdf

se hai domande chiedi, se vuoi in privato, magari qui non interessa.

per una prima infarinatura, invece, vai qui:

https://support.google.com/a/answer/1371415?hl=it
Final Job
2024-04-01 15:54:46 UTC
Permalink
Post by issdr
Post by Final Job
E' ampiamente fuori dalla mia portata ma ho capito che si fa
riferimento al Regular Expression Language. Pur avendo individuato
alcune pubblicazioni in rete che forniscono tabelle esplicative del
funzionamento dei caratteri da voi usati, non individuo come si
estrapola da str la percentuale e proprio quella.
bisogna entrare nella logica, ma un uso basilare non è complicato.
avevo scritto del codice commentato per Bruno, ma senza che te lo vada a
http://www.ndp77.net/dnld/Spadaccini_Regexp.pdf
se hai domande chiedi, se vuoi in privato, magari qui non interessa.
https://support.google.com/a/answer/1371415?hl=it
OK, ti ringrazio molto.
Ale

issdr
2024-03-29 22:23:44 UTC
Permalink
Post by Final Job
Excel 2016 non supporta la funzione LET
però se sei sotto Windows hai FILTRO.XML

https://stackoverflow.com/a/66864685/5494004
Final Job
2024-03-30 21:18:56 UTC
Permalink
Post by issdr
Post by Final Job
Excel 2016 non supporta la funzione LET
però se sei sotto Windows hai FILTRO.XML
https://stackoverflow.com/a/66864685/5494004
Grazie ISSDR
Buona serata
Ale
Final Job
2024-03-30 21:15:25 UTC
Permalink
Vi ringrazio nuovamente
L'UDF funziona

@ issrd
la funzione filterxml non riesco ad applicarla
Buona serata
Ale
Loading...