022. Normalizzare DB con l’aiuto dell’algoritmo Soundex

Download PDF

Domanda:

“storicamente nell’arco di alcuni decenni, differenti persone in differenti modi hanno raccolto dati. La raccolta ammonta ad un totale di circa 3.000 celle all’anno per ogni foglio ed è un incubo perchè lo stile dei fogli è stato stravolto dall’avvicendarsi eterogeneo di decine di collaboratori diversi che si sono succeduti nello stesso ufficio a raccogliere i dati. Dati inseriti in maiuscolo, minuscolo, scritti correttamente per intero, abbreviati, storpiati e/o alterati…. cut….dovrei scoprire il modo di far cercare ad Excel variabili più o meno farcite di wildcard singole tipo le ’?’ o ’*’ da vecchio DOS. Per dire: Corso Vittorio Emanuele II lo posso per esempio trovare come CORSO, corso, C.so, C; Vittorio, VITTORIO, V.; Emanuele, Emmanuele o Emanuelle … una cosa da uscire pazzi. Un Vs. collega dal suo blog mi suggeriva: Io metterei tutti i dati in un unico foglio. Ognuno in una sua riga. La prima colonna conterrà l’anno, così non si perde il riferimento.

Poi, la ricerca ne viene probabilmente facilitata anche con l’uso dell’algoritmo Soundex.

…. cut….l’ho incollata in un modulo ma non riesco a trovare il modo di applicarla.”

 

Risposta:

Personalmente non conoscevo questo algoritmo e ne ho trovato una definizione al seguente link:

http://www.excelvba.it/Forum/story/Visual_Basic_for_Applications/Soundex.html

Soundex è un algoritmo di fonetica per l’indicizzazione di parole secondo il loro suono o pronuncia. cut… L’obiettivo è di poter raggruppare parole omofone (dal suono simile) affinché possano essere abbinate per un ricerca veloce, nonostante differenze o errori di ortografia. cut…Ad esempio, MATTONE è codificato come M350; MATTINO e METANO hanno la stessa codifica M350 (e infatti hanno un suono simile)

L’algoritmo non è in grado di associare le stringhe contenenti abbreviazioni come “Corso” e “C.so”

Una volta inserito l’algoritmo all’interno di un Modulo, posto di avere una parola nella cella A1,

nella cella B1 basta scrivere =soundex(A1,8) dove 8, a scelta dell’utilizzatore, indica il grado di precisione desiderato (la lunghezza del codice restituito).

L’algoritmo non salva dalla lunga opera manuale di normalizzazione dei dati, ma da certamente un aiuto. Ecco come ho proceduto per automatizzare un pò l’operazione.

ATTENZIONE:

per vostra sicurezza create una copia del file da analizzare in modo da essere sicuri di avere la base dati originale.

>>> l’azione delle macro non è reversibile <<<

Passo1:

Aprire l’editor VBA del file da normalizzare e copiare il modulo contenuto nel file d’esempio allegato

Passo2:

Inserire alla destra della colonna da normalizzare le seguenti 4 colonne d’appoggio:

-Codice Soundex

-Check

-Valore da usare (X)

-Valore Normalizzato

Passo3:

Selezionare la cella contenente l’intestazione della colonna da normalizzare e lanciare la macro “A_PreparaFoglio”

La macro effettua una serie di controlli sulla selezione della colonna da analizzare e sulla presenza delle colonne d’appoggio.

Se i check hanno esito positivo, inserisce l’algoritmo Soundex (con precisione ‘8’) in questo modo:

For i = 2 To Last_Row

Cells(i, COLCodiceSoundex) = soundex(Cells(i, COLDaAnalizzare), 8)

Next i

Passo4:

Ordinare manualmente TUTTA la base dati per il campo “Codice Soundex”, non importa se in ordine crescente o decrescente.

Senza tale operazione le sucessive macro non sortiscono il risultato voluto.

Passo5:

Lanciare la macro “B_EffettuaCheck” che opera in questo modo:

effettua un coutif dei codici Soundex e con un ciclo for next, per i codici che appaiono più di una volta,

per ciascun codice verifica che il corrispondente valore testuale sia identico a quello della riga sucessiva (a questo serve aver ordinato i dati)

Quando la corrispondenza non si verifica, nella colonna “Check” viene indicato “Verifica!”

Dopo passa di nuovo in rassegna i codici e scrive “Verifica!” anche per il primo della serie dei codici check utilizzato come riferimento.

Passo6:

Filtrare la colonna “Check” per “Verifica!”, filtrare la colonna “Codice Soundex” per un codice, verificare quale delle celle contiene il valore esatto ed inserire una “X” nella colonna “Valore da usare (X)” nella stessa riga

Passo7:

Lanciare ma macro “C_Normalizza” che inserisce i valori normalizzati nella colonna “Valore Normalizzato”

Dopo aver controllato il risultato della macro, si può procedere a copiare i valori normalizzati nella colonna analizzata.

Passo8:

Cancellare le 4 colonne d’appoggio

Passo9:

Rripetere le operazioni dal Passo1 per tutte le colonne che interessa analizzare.

Come vedete la manualità resta, ma ora si ha un aiuto automattizzato

In allegato il file d’esempio

FunzioneSoundex

Riccardo Vincenti

The following two tabs change content below.