C# : Search engine pour n'importe quelle date dans un texte
bpignier
Messages postés3Date d'inscriptionjeudi 11 septembre 2003StatutMembreDernière intervention25 avril 2005
-
20 juil. 2004 à 12:11
bpignier
Messages postés3Date d'inscriptionjeudi 11 septembre 2003StatutMembreDernière intervention25 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. :-)
bpignier
Messages postés3Date d'inscriptionjeudi 11 septembre 2003StatutMembreDernière intervention25 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>
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. :-)