sono alle prese con la normalizzazione di un DB.
Ora il "programmatore" che l'ha impostato ha seguito alla perfezione le regole della normalizzazione, tra cui particolare attenzione ha rivolto alla prima. Infatti il campo "indirizzo" contiene
VIA LE MANI DAL NASO, 00100 MILANO
Ora, vorrei provare a fare una normalizzazione dei dati, ma (ovviamente) il numero di caratteri non corrisponde mai...
Per carità, sono un migliaio di clienti, ma se gli dico di farlo a manina mi mandano a quel paese (con il cap davanti pure)
Qualsiasi idea/suggerimento è bene accetto...
Ciao, e grazie in anticipo a tutti
Max
_________________________________________
Se non ti suggeriscono di meglio (ma dubito che accada) puoi usare queste.
Girano su Excel, dividono e uniscono stringhe con qualsiasi separatore vuoi
usare (spazio, nel tuo caso).
Puoi esportare, elaborare ed reimportare.
Sub aSplit()
'/////////////
'Funzione SPLIT. Divide una stringa in n-sottostringhe.
'Fuoco sulla prima cella a dx di quella da dividere.
'Output nelle celle adiacenti di dx.
'/////////////
Dim a As Range, b() As String, c As String
c = InputBox("Inserisci il criterio di delimitazione delle singole
stringhe")
Do Until Selection.Offset(0, -1) = ""
If Selection.Offset(0, -1) = "" Then
Selection.Offset(1, 0).Select
Else
Set a = Selection.Offset(0, -1)
b() = Split(a, c, -1, vbBinaryCompare)
ActiveCell = b(0)
For i = 1 To UBound(b)
Selection.Offset(0, i) = b(i)
Next
Selection.Offset(1, 0).Select
End If
Loop
End Sub
Sub aJoin()
'Fuoco sulla prima colonna di sx ("A")
Dim c() As String, a As String, b As String, d As Range
Dim Col As Integer, i As Integer, separatore As String
separatore = InputBox("Inserisci il separatore che intendi usare",
"Kronos")
Do Until ActiveCell = ""
If Selection.Offset(0, 1).Value <> "" Then Range(Selection,
Selection.End(xlToRight)).Select
Set d = Selection
Col = d.count
Selection.End(xlToLeft).Select
a = ActiveCell
i = 1
For i = 1 To Col
Selection.Offset(0, 1).Select
b = ActiveCell
a = a & separatore & "" & b
Next i
Selection.Offset(0, -Col).Select
ActiveCell = a
Selection.Offset(1, 0).Select
a = ActiveCell
Col = 0
Loop
End Sub
Ciao.
eSQueL
dai manda il file ... te lo faccio a manina per 500 euro ... o una
cassa di soave ...
:-)
Potresti:
- trimmare la stringa del contenuto del campo indirizzo
- scandirla da destra verso sinistra e:
a) cercare la posizione del primo spazio
b) assumere che la città sia ciò che segue la posizione al punto a)
c) estrarre la sottostringa fino alla posizione a)
d) ripetere il passo a) sulla stringa ottenuta al passo c)
e) assumere che il cap sia ciò che segue la posizione al punto d)
f) assumere che il toponimo sia la left della stringa al passo c) fino
alla posizione al passo d)
In pratica:
se Indirizzo="VIA LE MANI DAL NASO, 00100 MILANO"
il primo spazio da destra verso sinistra è in posizione 40, quindi
Città=Mid$(Indirizzo,41)
Applicando Indirizzo=Trim$(Left$(Indirizzo,41)) ottieni
Indirizzo="VIA LE MANI DAL NASO, 00100"
dove il primo spazio da destra verso sinistra è in posizione 28,
quindi
CAP=Mid$(Indirizzo,29)
e Toponimo=Trim$(Left$(Indirizzo,28))
Se però
Indirizzo="VIA LE MANI DAL NASO, 00123 S. Giovanni in
Persiceto"
non può funzionare.
In alternativa, potresti cercare nella stringa dell'indirizzo i valori
dei CAP e dei comuni letti dall'archivio delle poste.
Però se Indirizzo contiene Incisa V.no non lo troverai mai, dato che
la denominazione ufficiale è Incisa in Val d'Arno ...
Forse, combinando i due metodi ...
>
> Se non ti suggeriscono di meglio (ma dubito che accada) puoi usare
> queste.
intanto grazie
>
> Girano su Excel, dividono e uniscono stringhe con qualsiasi
> separatore vuoi usare (spazio, nel tuo caso).
>
> Puoi esportare, elaborare ed reimportare.
>
[CUT]
il problema è che lo spazio (mio separatore) non è il massimo... ovvero in alcuni casi ce ne sono due, in altri tre :-(
Comunque ora guardo bene le funzioni e ci medito
> Ciao.
>
> eSQueL
Grazie e ciao,
Max
intanto grazie
> Ciao.
>
> eSQueL
Grazie e ciao,
Max
_________________
Funge anche se lo spazio è ripetuto
>
> dai manda il file ... te lo faccio a manina per 500 euro ...
stavo pensando di prendere unA stagistA infatti ;-)
> o una cassa di soave ...
ecco... già più fattibile
> :-)
Ciao,
Max
Infatti la mia prima idea era di fare un parse della striga per trovare i 5 valori numerici del cap
determinato quello, a sinistra c'è l'indirizzo a destra la località
Perderei il campo della provincia che farebbe anche lo stesso
Grazie mille anche a te.
Ciao,
Max
Secondo me ti conviene individiare per primo il CAP partendo da destra (lato città), in quanto non
esistono città che annoverano nel loro nome numeri a 5 cifre. Non partire da sinistra (lato
indirizzo) in quanto potrebbero esserci vie (!!!) del tipo
Via milano 12590
e 12590 ti diventerebbe CAP e non numero civico.
Una volta individuato il CAP puoi tranquillamente ricavare indirizzo e città.
Una soluzione....
Michele
ecco... già più fattibile
> :-)
Ciao,
Max
;-)
[risposta]
Prova così: sostituisci (a più riprese) la sequenza di 2 spazi con un
carattere "strano" es. ~ = ALT+(pad numerico)126.
Poi sostituisci (a più riprese) tutte le sequenze di 2 ~ con 1 ~.
Alla fine dovresti ottenere i dati separati dal carattere particolare; lo
utilizzi insieme alla funzione Split per separare le informazioni...
Ciao.
P.S. Ovviamente fai prima una copia della tabella.
--
Sergio MAZZA