Extraire une chaine de caractère en c#

Résolu
haddreezy Messages postés 40 Date d'inscription lundi 14 mai 2012 Statut Membre Dernière intervention 8 août 2012 - 14 mai 2012 à 16:23
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre 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?

8 réponses

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
15 mai 2012 à 16:20
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é. -
3
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
14 mai 2012 à 17:51
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é. -
1
haddreezy Messages postés 40 Date d'inscription lundi 14 mai 2012 Statut Membre Dernière intervention 8 août 2012 4
15 mai 2012 à 09:23
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.
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
15 mai 2012 à 11:38
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é. -
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
haddreezy Messages postés 40 Date d'inscription lundi 14 mai 2012 Statut Membre Dernière intervention 8 août 2012 4
15 mai 2012 à 15:42
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);






}
0
haddreezy Messages postés 40 Date d'inscription lundi 14 mai 2012 Statut Membre Dernière intervention 8 août 2012 4
15 mai 2012 à 16:38
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#.
0
haddreezy Messages postés 40 Date d'inscription lundi 14 mai 2012 Statut Membre Dernière intervention 8 août 2012 4
15 mai 2012 à 16:54
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.
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
15 mai 2012 à 21:10
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é. -
0
Rejoignez-nous