Extraire une chaine de caractère en c# [Résolu]

Messages postés
40
Date d'inscription
lundi 14 mai 2012
Dernière intervention
8 août 2012
- 14 mai 2012 à 16:23 - Dernière réponse :
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
- 15 mai 2012 à 21:10
Bonjour,

pour un projet je me dois de récupérer des informations dans un fichier xml. Je développe en C# sous visual C# 2010. Après avoir chargé mon fichier je dois récupérer certaines informations. Voici un extrait du fichier xml:
<description>SNCF-WIBU [xx:xx:xx:xx:xx:xx]
WPA2-Personal
-68dBm
Channel 1
GPS
Lat,Lon,Alt 0,0,0
Speed (km/h) 0
Time (UTC) 2012-04-30T13:47:32.845Z
Precision
Satellite Count 0
Fix Mode
VDOP 0
HDOP 0
PDOP 0
</description>

Je stocke tout ce texte dans un string. Puis je dois recueillir les infos suivantes: 1)SNCF-WIBU []
2)-68dBm
3)0, 0, 0
4)13:47:845
Voici le code que j'ai écrit pour récupérer les noms :
s1 = nd.InnerText;

// Nom des APs
string[] split_name = s1.Split(new Char[] { '[', ']' });

s2 = split_name[0];
s3 = split_name[1];
s4 = s2 += s3;

Console.WriteLine(s4);
Malheureusement je me trouve embêté pour récupérer les autres informations car je ne vois pas quels délimiteurs je pourrai utiliser. Pouvez m'aider s'il vous plait?
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
- 14 mai 2012 à 17:51
3
Merci
Salut

Que ce soit pour les possibilités ou les performances, les expressions régulières sont LA solution à ce genre de problème.

Il faut donc écrire le pattern correspondant à ce que tu veux.
Exemple pour la première ligne :
string pattern =  @"[A-Z\-]+ \[(?([0-9:]+))\]";

Voici comment lire cette Regex :
[A-Z\-] : N'importe quel lettre entre A et Z (majuscule) ou un - (le - étant un caractère spécial en regex, il est précédé de \)
+ : Au moins une fois, ou plus.
=> Donc un groupe de lettres et d'espaces

<espace> : Suivi d'un espace (tout simplement)
\[ : Suivi de [ (caractère spécial, donc précédé de \)

Les parenthèses, c'est comme dans les opérations mathématiques, c'est pour regrouper des choses.

? : Le groupe suivant est appelé "identifiant"
[0-9:]+ : Au moins une fois (ou plus) un chiffre ou : (je ne sais pas ce à quoi ressemblera xx:xx:xx. S'il peut s'agir de lettres majuscules et minuscules également, tu remplaces juste par [A-Za-z0-9:]+. Si c'est une macaddress : [A-Fa-f0-9:]+)

\] : Suivi de ]

Ainsi, ta première ligne a une correspondance avec le pattern, et tu as appelé ta suite xx:xx:xx:xx:xx:xx "identifiant"

string pattern  = @"[A-Z\-]+ \[(?([0-9:]+))\]";
Regex searchRegEx = new Regex(pattern);
Match correspondance = searchRegEx.Match(nd.InnerText);
string identifiant = correspondance.Groups["identifiant"].Value;



Bon, je t'ai montré les bases, mais je ne peux pas non plus te faire un cours sur tout ce qui concerne les regex. Mais tu trouveras facilement plus d'infos via quelques petites recherches sur Google.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -

Merci krimog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de krimog
Meilleure réponse
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
- 15 mai 2012 à 16:20
3
Merci
Salut

Déjà, plutôt que d'utiliser une ArrayList, utilise une List<string>. Au moins, tes objets dans ta list seront typés.

List<string> myList =  new List<string>();
myList.Add(nom);
//...


Ensuite, comment (dans quel format) souhaites-tu enregistrer tes données ? Un fichier csv genre :
nom1,puissance1,coordonnees1,temps1
nom2,puissance2,coordonnees2,temps2
... ?

Si c'est le cas, soit tu ne fais pas de liste et tu remplis ton fichier au fur et à mesure, soit tu fais une liste d'objet (où l'objet contiendra une propriété Nom, une propriété Puissance...)

1er cas
// Création de ton StreamWriter nommé writer

foreach (XmlNode nd in nodeList) 
{
    // ton code ci-dessus
    writer.WriteLine(string.Format("{0},{1},{2},{3}", nom, puissance, coordonnees, temps));
}

// Fermeture de ton writer


2ème cas
class DataToWrite
{
    public string nom;
    public string puissance;
    public string coordonnees;
    public string temps;
} 

// Et dans ta méthode : 
List<DataToWrite> myList  = new List<DataToWrite>();
foreach (XmlNode nd in nodeList) 
{
    // ton code ci-dessus
    DataToWrite data = new DataToWrite();
    data.nom = nom;
    data.puissance = puissance;
    data.coordonnees = coordonnees;
    data.temps = temps;
    myList.Add(data);
}

// Création de ton writer
foreach (DataToWrite data in myList)
{
    writer.WriteLine(string.Format("{0},{1},{2},{3}", data.nom, data.puissance, data.coordonnees, data.temps));
}
// Fermeture de ton writer


Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -

Merci krimog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de krimog
Messages postés
40
Date d'inscription
lundi 14 mai 2012
Dernière intervention
8 août 2012
- 15 mai 2012 à 09:23
0
Merci
Merci beaucoup pour ton aide, je vais essayer avec les outils que tu m'as donnés. Je vous tiendrai au courant du résultat.
Commenter la réponse de haddreezy
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
- 15 mai 2012 à 11:38
0
Merci
Juste une petite erreur d'étourderie :
=> Donc un groupe de lettres et d'espaces


Je voulais évidemment dire
=> Donc un groupe de lettres et de tirets


Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Commenter la réponse de krimog
Messages postés
40
Date d'inscription
lundi 14 mai 2012
Dernière intervention
8 août 2012
- 15 mai 2012 à 15:42
0
Merci
J'ai réussi à faire ce que je voulais grâce à toi. Merci. J'aurai par contre une dernière question. Après avoir extrait les informations que je voulais, je les stocke dans une Arraylist. Mais je n'arrive pas par la suite à copier cette Arraylist dans un fichier .txt, pour pouvoir ensuite l'ouvrir avec excel et tracer des graphes. Peux tu m'apporter une dernière fois ton aide?
Je mets mon code pour ceux que ça intéressent:

// 2. Déclaration des variables

string s1;


// 3. Extraction des informations recherchées

foreach (XmlNode nd in nodeList)
{

s1 = nd.InnerText;

// Nom des APs

string pattern = @"(?<Nom>([A-Za-z0-9 \-_\[\]]+ \[[0-9A-Z:]+\]))";
Regex searchRegEx = new Regex(pattern);
Match correspondance = searchRegEx.Match(s1);
string nom = correspondance.Groups["Nom"].Value;

// Puissance des APs

string pattern1 = @"(?(\-[0-9]+dBm))";
Regex searchRegEx1 = new Regex(pattern1);
Match correspondance1 = searchRegEx1.Match(s1);
string puissance = correspondance1.Groups["Puissance"].Value;



// Coordonnées GPS

string pattern2 = @"(?<Coordonnées>([0-9]+,[0-9]+,[0-9]+))";
Regex searchRegEx2 = new Regex(pattern2);
Match correspondance2 = searchRegEx2.Match(s1);
string coordonnées = correspondance2.Groups["Coordonnées"].Value;




// Temps

string pattern3 = @"(?<Temps>([0-9]+:[0-9]+:[0-9]+.[0-9]+Z))";
Regex searchRegEx3 = new Regex(pattern3);
Match correspondance3 = searchRegEx3.Match(s1);
string temps = correspondance3.Groups["Temps"].Value;

// Création du tableau

ArrayList myAL = new ArrayList();
myAL.Add(nom);
myAL.Add(puissance);
myAL.Add(coordonnées);
myAL.Add(temps);
//PrintValues(myAL);






}
Commenter la réponse de haddreezy
Messages postés
40
Date d'inscription
lundi 14 mai 2012
Dernière intervention
8 août 2012
- 15 mai 2012 à 16:38
0
Merci
En effet je veux récupérer un fichier sous la forme que tu as indiquée, comme ça Excel créera directement un tableau ordonné, et ma construction de graphe sera plus simple. Je te remercie vraiment pour ton aide, vu que je suis débutant dans la programmation en C#.
Il me reste un dernier problème à résoudre, les droit d'accès à mon fichier sont refusés . Il faut donc que je les change je suppose, peut être avec un chmod? je ne sais pas si cette technique existe en C#.
Commenter la réponse de haddreezy
Messages postés
40
Date d'inscription
lundi 14 mai 2012
Dernière intervention
8 août 2012
- 15 mai 2012 à 16:54
0
Merci
J'ai résolu mon problème d'accès au fichier, j'avais oublié de renseigné le nom du fichier, j'avais simplement mis le nom du répertoire. Tout fonctionne à merveille désormais merci pour tout.
Commenter la réponse de haddreezy
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
- 15 mai 2012 à 21:10
0
Merci
De rien.

En revanche, merci de choisir la ou les réponses qui t'ont permis de résoudre ton problème, et de cliquer sur "Réponse acceptée !" à gauche.
Sur ce, bonne fin de journée.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Commenter la réponse de krimog

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.