Algoritmo separazione tra cognome e nome (piccola sfida fruttuosa)

Allo scopo di preparare una funzione da "offrire" ai colleghi programmatori Vi chiedo di scrivere la "vostra" funzione.

Lo scopo è dividere un testo tra il cognome ed il nome.

Ad esempio "Bastianello Luciano" (persona.descrizione) diventa persona.cognome = Bastianello e persona.nome = Luciano
Molto facile direte ma cosa diventa in presenza di: Franco Maria Francesco ? oppure De Rossi Renato Alberto?.
A disposizione per fare dei tests ci sono i campi:
Persona.Descrizione (contiene il nome completo della persona)
Persona.CodiceFiscale (Contiene il codice fiscale) - può mancare ma la maggioranza degli oggetti "persona" contiene il codice fiscale
Persona.PartitaIva (Partita iva - non ho detto che non è facile?) - può mancare
Persona.Sesso (Maschio, Femmina, Non dichiarato) non dichiarato = società oppure persona che non ha dichiarato il sesso

Ovviamente non si pretende una funzione infallibile ma almeno una che "ci prenda" nella maggior parte dei casi
Io ho già scritto la mia funzione, attendo le vostre scritte in uno (o in tutti) dei linguaggi C#, VB.NET, VB6

 

Print | posted on martedì 27 febbraio 2007 01:17

Feedback

# re: Algoritmo separazione tra cognome e nome (piccola sfida fruttuosa)

Left by Diego at 27/02/2007 12:35
Gravatar Secondo me, bisogna cercare di fare 'sfoltimento', cioè bisogna elaborare i dati in modo da definire un campo con valori identificabili e raggruppabili.
Così ho sviluppato una classe Persona con determinati valori di default o di esito per il campo Nome. Ci sono anche due costruttori in overload, per richiedere descrizione e un codice (fiscale o iva).

Quello che ti potrebbe interessare è il metodo IndovinaCognomeNome.

Public Class Persona

Dim mDescrizione As String = String.Empty
Dim mCognome As String = String.Empty
Dim mNome As String = "dati insufficienti"
Dim mCodiceFiscale As String = String.Empty
Dim mPartitaIva As String = String.Empty
Dim mSesso As String = "Non dichiarato"

Public Property Descrizione() As String
Get
Return mDescrizione
End Get
Set(ByVal Value As String)
mDescrizione = Value
End Set
End Property

Public Property Cognome() As String
Get
Return mCognome
End Get
Set(ByVal Value As String)
mCognome = Value
End Set
End Property

Public Property Nome() As String
Get
Return mNome
End Get
Set(ByVal Value As String)
mNome = Value
End Set
End Property

Public Property CodiceFiscale() As String
Get
Return mCodiceFiscale
End Get
Set(ByVal Value As String)
mCodiceFiscale = Value
End Set
End Property

Public Property PartitaIva() As String
Get
Return mPartitaIva
End Get
Set(ByVal Value As String)
mPartitaIva = Value
End Set
End Property

Public Property Sesso() As String
Get
Return mSesso
End Get
Set(ByVal Value As String)
mSesso = Value
End Set
End Property

Public Sub New(ByVal descrizione As String)
Me.Descrizione = descrizione
End Sub

Public Sub New(ByVal descrizione As String, ByVal codice As String)
Me.Descrizione = descrizione
If codice.Length = 16 Then
CodiceFiscale = codice
Else
PartitaIva = codice
End If
End Sub

Public Sub IndovinaCognomeNome()
Dim tokens() As String = Descrizione.Split(" "c)
If PartitaIva <> String.Empty Or tokens.Length = 1 Then
Cognome = Descrizione
Nome = String.Empty
ElseIf tokens.Length = 2 Then
Cognome = tokens(0)
Nome = tokens(1)
End If
If CodiceFiscale <> String.Empty Then
Dim p As Integer = Descrizione.IndexOf(CodiceFiscale.Chars(1))
p = Descrizione.IndexOf(CodiceFiscale.Chars(2), p + 1)
p = Descrizione.IndexOf(" "c, p + 1)
p = Descrizione.IndexOf(CodiceFiscale.Chars(3), p + 1)
Cognome = Descrizione.Substring(0, p - 1)
Nome = Descrizione.Substring(p + 1)
If CodiceFiscale.Chars(9) > "4"c Then
Sesso = "Femmina"
Else
Sesso = "Maschio"
End If
End If
End Sub

End Class

Your comment:





 
Please add 6 and 2 and type the answer here:

Copyright © Luciano Bastianello

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski