C# : Search engine pour n'importe quelle date dans un texte

bpignier Messages postés 3 Date d'inscription jeudi 11 septembre 2003 Statut Membre Dernière intervention 25 avril 2005 - 20 juil. 2004 à 12:11
bpignier Messages postés 3 Date d'inscription jeudi 11 septembre 2003 Statut Membre Dernière intervention 25 avril 2005 - 23 juil. 2004 à 16:14
Bonjour tout le monde !

Je suis en train de développer une application C# dont l'un des objectifs est de détecter n'importe quel type de Date dans un texte de plusieurs lignes.

Voici quelques exemples de date que l'on peut trouver :

-> 07 September/ Septembre

-> 05/10/2003 pour 2 Nuits

-> 18/September/2003

-> September 15 2003, 2 pm

-> A partir du (année-mois-jour): 2003-September-13

Comme vous le constater, le format change souvent et reste peu conventionnel. Aussi j'aimerai adapter un pattern unique qui me permettrait, par parcours des caractères, de déterminer si je suis en présence d'une date et de me la retourner dans un objet DateTime.

Je réussi néanmoins à récupérer quelques Dates grace aux format de date prise en charge par le framework en utilisant un parcours un à un de caractères pour chaque ligne, ajoutés dans une variable, qui passe alors dans un TRY ...CATCH qui tente un Convert.toDateTime () . Et quand ca CATCH on réitère jusqu'a ce que ca passe !

C'est très limité.

Quelqu'un a t-il un début de solutions ? des pistes de travail ?
Avez vous déjà rencontré ce cas de figure ?

Note : les heures et minutes ne m'intéressent pas.

Merci
Benj.

--------------
La hasard est la forme que prend Dieu pour passer inaperçu. :-)

2 réponses

cs_JuS Messages postés 121 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 20 mars 2009 1
23 juil. 2004 à 15:51
T'as essayé avec les expressions régulières ?

-=[JuS]=-

Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live
0
bpignier Messages postés 3 Date d'inscription jeudi 11 septembre 2003 Statut Membre Dernière intervention 25 avril 2005
23 juil. 2004 à 16:14
Je n'ai pas essayé les expressions régulières.
En fait, faut bien comprendre que le source du texte, il peut être écrit par n'importe qui et que le programme lui doit pouvoir identifier un maximum de dates. Il n'ya donc pas de régles précises.

Voilà le code source que je propose pour le moment :

/// <summary>
/// Lance la recherche de la date d'arrivee
/// </summary>

public bool Scan (System.IO.Stream fichier, out DateTime _date)
{

//Sortie
bool res = true ;

// Ecriture au journal
erreurs.Add("\n\n -> Date d'arrivée <- \n\n") ;

using (StreamReader srt = new StreamReader(fichier))
{
String line ;
while ((line = srt.ReadLine()) != null)
{
DateTime dt = this.RechercheDate(line) ;
if (dt != DateTime.MinValue)
_date = dt ;
}

}
// Toutes les lignes ont ete traiteesif (_date DateTime.MinValue) res false ;
srt.Close() ;

return res ;
}

/// <summary>
/// Obtient une date se trouvant dans une chaine de caractere
/// </summary>

private DateTime RechercheDate(string chaine)
{
// Valeur de sortie
DateTime dateTrouve = DateTime.MinValue ;

//compteur
string cpt = "" ;

System.IFormatProvider format =
new System.Globalization.CultureInfo("fr-FR", true);

//Traitement spécifique au numero de reservation
try
{
dateTrouve = System.DateTime.Parse(chaine,
format,
System.Globalization.
DateTimeStyles.AllowWhiteSpaces);
}
catch
{
// Première date trouvée, unique retournée
for (int i=chaine.Length-1; i>=0 ; i--)
{
cpt = chaine.Substring(0,i) ;
try
{
dateTrouve = System.DateTime.Parse(cpt,
format,
System.Globalization.
DateTimeStyles.AllowWhiteSpaces);
break;
}
catch
{
}
}
}

//Ecriture journal
if (dateTrouve != DateTime.MinValue) erreurs.Add("### Date identifiée : "" + dateTrouve.ToShortDateString() + """) ;
else erreurs.Add("### Date identifiée : aucune") ;

// retour de fonction
return dateTrouve ;
}

Explications :

Voici le code source pour la recherche d'une date dans un texte.

La fonction "Scan" recherche une date à partir d'un texte,. Chaque ligne est parcourue et un curseur identifie si une date est présente à chaque ligne.

J'aurai pu mettre une collection de datetime pour enregistrer toutes les dates trouvées dans le texte et non me limiter à la premiere date trouvée. J'ai 90% de date correcte avec cette fonction.

Benjamin

La hasard est la forme que prend Dieu pour passer inaperçu. :-)
0
Rejoignez-nous