› Excel e gli applicativi Microsoft Office › Sfida di inizio Estate: estrai le iniziali
-
AutoreArticoli
-
solo per curiosità
questa funziona dal 2016 in poi ( solo per il CONCAT()) ma ha il limite dei caratteri
=SE($A1<>"";CONCAT(MAIUSC(SINISTRA(FILTRO.XML("<d>"&SOSTITUISCI(SOSTITUISCI(MINUSC(SOSTITUISCI(A1;"'";" "));"'";" ");" ";"")&"</d>";"//a[string-length()>2][(.!='con') and (.!='per') and (.!='tra') and (.!='fra') and (.!='del') and (.!='dello') and (.!='della') and (.!='dell') and (.!='dei') and (.!='degli') and (.!='delle') and (.!='allo') and (.!='alla') and (.!='dall')]");1)));"")
onestamente mi sono fatto aiutare da Terio per la parte da eliminare sperando di poter
semplificare la cosa ma ad oggi così si fa.
ho eliminato tutte le parole sotto i tre caratteri meno variabili

solo per curiosità
Non posso provarla, ma Automobil Club d'italia te lo restituisce correttamente (ACI)?
ciao
certo ho sostituito l'apostrofo con uno spazio
Automobil Club d'italia ----ACI

certo ho sostituito l'apostrofo con uno spazio

Bisognerebbe creare una sezione apposita per "Gianfranco il Formulaio Magico"
ciao
vecchio trentino
come già detto in questa formula mi ha aiutato molto Eleuterio
la mia sarebbe stata più lunga nella parte dove escludiamo preposizioni e congiunzioni
(una bella scremata c'è eliminando le parole sotto le due lettere)
con FILTRO.XML siamo partiti prendendoci per il xxxx io e Terio
poi piano piano si è scoperto che è una formula che è portentosa
per la gestione delle stringhe e non abbiamo ancora finito di imparare
ad utilizzarla.
certo ha i suoi limiti ma per uno che ha versioni vecchie è fantastica
e parte da 2013
con FILTRO.XML siamo partiti prendendoci per il xxxx io e Terio
Crudo ma onesto
certo ha i suoi limiti ma per uno che ha versioni vecchie è fantastica
Ad avere tempo e pazienza
Comunque vi lascio il mio tentativo. Ho utilizzato le espressioni regolari.
Option Explicit Function initials(s As String) As String Dim e As String Dim p As String Dim t As String Dim re As Object Dim oMatch As Object Dim oMatches As Object e = "di|a|da|in|con|su|per|tra|fra|del|dello|della|dei|degli|delle|" & _ "al|allo|alla|ai|agli|alle|dal|dallo|dalla|dai|dagli|dalle|nel|nello|" & _ "nella|nei|negli|nelle|col|coi|sul|sulla|sui|sugli|sulle|il|lo|la|i|gli|le|" & _ "un|uno|una|l'|d'" p = "(?:(?:\b(?:%e)\b(?:\W(?:%e)\b)*))" p = Replace(p, "%e", e) Set re = CreateObject("VBScript.RegExp") With re .ignorecase = True .Global = True .Pattern = p End With 'elimina dalla stringa le parole da escludere t = re.Replace(s, "") 'considera solo le iniziali delle parole restanti re.Pattern = "\b\w" 'recupera i singoli gruppi di parole restanti p = "" Set oMatches = re.Execute(t) For Each oMatch In oMatches p = p & oMatch Next 'restituisce il risultato in MAIUSCOLO initials = UCase$(p) End FunctionTest:
?initials("C'è un gatto che prova a volare sul nido d'uccellino, là su quell'albero")Result:
CGCPVNULQASarebbe interessante la statistica di scossa sulle sue ventimila e passa righe di test. Ma penso che sara' abbastanza lenta perche' c'e' il collo di bottiglia del For Each finale. Se fossi riuscito a fare il contrario, cioe' ricavare le parole senza l'iniziale, invece di ricavare la colllction delle sole iniziali, avrei operato una sostituzione sul posto e sarebbe stato velocissimo.
ciao
mi sai dire perchè lasci la vocali E O U
magari U non serve ma E-O vengono spesso usate come congiunzioni
non ti conviene eliminare tutte le parole inferiori alle tre lettere?
andiamo o a Milano o a roma..........AOMOR
andiamo a Milano e a roma.............AMERSarebbe interessante la statistica di scossa sulle sue ventimila e passa righe di test.
Eccola (non capisco perché oggi il mio pc sia ancora più lento del solito):
EstraiIniziali_alfrimpa, finito in: 7,23468440478587 ACRONIMO_ercolini, finito in: 5,14825958933261 Initials_VF, finito in: 80,7102357120998 Acronimo_scossa, finito in: 1,40821698873697penso che sara' abbastanza lenta perche' c'e' il collo di bottiglia del For Each finale.
Ho rifatto il test escludento il ciclo finale:
Set oMatches = re.Execute(t) ' For Each oMatch In oMatches ' p = p & oMatch ' Nextma non è certo quello il collo di bottiglia:
EstraiIniziali_alfrimpa, finito in: 7,17447817535844 ACRONIMO_ercolini, finito in: 5,12802710539859 Initials_VF, finito in: 79,5 Acronimo_scossa, finito in: 1,39518956611937commentando anche il Set:
' Set oMatches = re.Execute(t) ' For Each oMatch In oMatches ' p = p & oMatch ' Nextsi risparmia qualcosa ma niente di drastico:
EstraiIniziali_alfrimpa, finito in: 7,23648881897634 ACRONIMO_ercolini, finito in: 5,18076516864858 Initials_VF, finito in: 77,716792807721 Acronimo_scossa, finito in: 1,39987740433071Comunque c'è qualcosa che non mi quadra in alcuni risultati rispetto alle esclusioni (cit.: "ma il verbo andare non dovrebbe essere escluso"): in "C'è un gatto che prova a volare sul nido d'uccellino, là su quell'albero" (*) -> CGCPVNULQA escludi il verbo essere: (è); poi con "società anonima dell'excel" restitusce SADE.
(*) la mia restitusce CÈGCPVNULQA ma se la è non vanno considerata basta aggiungerla ("#è#") alle escluse.
Eh infatti non e' per niente perfetta. Le espressioni regolari mi intrigano ma sono abbastanza complicate e comunque risultano lente come evidenziato. Il punto del verbo essere e' un buon test infatti.
non ti conviene eliminare tutte le parole inferiori alle tre lettere?
Abbiamo pur troppo ben piu' che poche parole tal che si dia luogo ad esclusioni (ecco: in questa frase solo "ad" andrebbe esclusa tra le parole di tre lettere o meno)
Sono passati dieci giorni... chiudiamo questa sfida con un ringraziamento a tutti i partecipanti!
Non c'e' un vincitore... e' stato interessante il concorso di tutti!
Alla prossima
-
AutoreArticoli
