Substring/Split problleme

Razordj Messages postés 51 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 13 avril 2011 - 18 mars 2011 à 21:27
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 30 mars 2011 à 09:04
J'aimerais extraire le nom du dossier/fichier dans des strings comme ceci:

"drw-rw-rw- 1 root root 258 1969-12-31 23:59 ."
^Dans celui ci le . est le nom du dossier^

"drw-rw-rw- 1 root root 16384 1980-01-01 00:00 appcache"
^Dans celui ci appcache est le nom du dossier^

Et etc.

L'algorithme pour trouver le nom qui est situé a la fin ne doit pas avoir de faille.

Merci.

16 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
19 mars 2011 à 00:09
Salut,

si tu veux etre sur
tu peux employer les regexp

sinon il y a le slipt

string[] dossiertab = maligne.Split(' ');
string dossier = dossiertab[dossiertab.length -2];

voila
0
Sehnsucht Messages postés 107 Date d'inscription samedi 25 novembre 2000 Statut Membre Dernière intervention 4 mai 2013
19 mars 2011 à 02:34
Bonjour,

@nhervagault:
Ça ne devrait pas plutôt être - 1 au lieu de -2 ? (dernier élément du tableau)
(voire avec le framework v3.5 ou + utiliser la méthode d'extension Last (ou LastOrDefault))

Si l'objectif est uniquement de récupérer ce dernier élément sans s'occuper du reste, et que la méthode risque d'être appelée souvent, le Split n'est peut-être pas la meilleure approche, car il oblige à traiter toute la chaîne pour juste en obtenir la fin.
Il faudrait peut-être privilégier une "simple" boucle pour parcourir la chaîne depuis la fin jusqu'au premier espace, exemple:
static class StringExtensions
{
public static string Extract(this string s)
{
//L'utilisation d'un StringBuilder est préconisé dès lors que
//de multiples concaténations de chaînes vont être faites.
var sb = new StringBuilder();
for(int i = s.Length - 1; i >= 0 && s[i] != ' '; --i)
sb.Insert(0, s[i]);
return sb.ToString();
}	
}

Cette approche a le mérite d'être environ 4 fois plus rapide sur les tests que j'ai effectués.
J'en ai fait une méthode d'extension mais ce n'est absolument pas obligatoire, c'est juste histoire de pouvoir l'utiliser comme ceci:
string source = "drw-rw-rw- 1 root root 16384 1980-01-01 00:00 appcache";
string res = source.Extract();


Maintenant si les autres éléments sont/seront nécessaires à un moment ou un autre, il peut être judicieux de passer la chaîne dans une regex pour en extraire les informations, mais à ce stade il y a trop peu d'informations pour déterminer celle-ci en fonction des éléments souhaité être récupérés et des différentes possibilités de chaîne pour obtenir une regex "sans faille".

Cordialement !
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
19 mars 2011 à 09:19
Merci pour la correction, j'etais fatigué :-)

Oui une fonction linq peut etre utilisée pour résoudre le probleme.

          
string dossier = "drw-rw-rw- 1 root root 16384 1980-01-01 00:00 appcache";
var q = (from c in dossier.Split(' ')
         select c).LastOrDefault();
MessageBox.Show(q);
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
19 mars 2011 à 09:21
j'ai ete trop vite ;-)

string dossier = "drw-rw-rw- 1 root root 16384 1980-01-01 00:00 appcache";
var q = dossier.Split(' ').LastOrDefault();
MessageBox.Show(q);

Suffit
0

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

Posez votre question
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
19 mars 2011 à 10:32
Salut,

petites questions :
le nom du répertoire peut-il contenir des espaces ?
se peut-il qu'une des 7 premières info de la ligne n'apparaissent parfois pas ?
si oui, les espaces sont-ils conservés ?

côté solution y'a bien les expressions régulières, mais c'est ch*ant à écrire ^^
jouer à chercher les espaces peut être pas mal, mais si le nom de répertoire contient des espaces il faut chercher le 7ème espace, et non le dernier. Et ce, ssi toutes les info sont toujours présentes (ou les espaces conservés).
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
19 mars 2011 à 11:34
Considerons qu'il y est des espaces

On peut faire un truc du genre

        string dossier = "drw-rw-rw- 1 root root 16384 1980-01-01 00:00 appcache dir";
            var q = dossier.Split(' ').Skip(7);
            MessageBox.Show(String.Join(" ", q.ToArray()));
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 mars 2011 à 10:37
Regexp, si le nom ne contient pas d'espace :

\S+$

Regex reg = new Regex(@"\S+$");
MessageBox.Show(reg.Match("drw-rw-rw- 1 root root 16384 1980-01-01 00:00 appcache").Value);


si espaces:
Regex reg = new Regex(@"(?<=(\S+\s+){7})(.+$)");
MessageBox.Show(reg.Match("drw-rw-rw- 1 root root 16384 1980-01-01 00:00 .").Value);
MessageBox.Show(reg.Match("drw-rw-rw- 1 root root 16384 1980-01-01 00:00 appcache").Value);
MessageBox.Show(reg.Match("drw-rw-rw- 1 root root 16384 1980-01-01 00:00 app cache").Value);


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
Razordj Messages postés 51 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 13 avril 2011
28 mars 2011 à 23:14
Le nombre d'espace entre chaque valeur peut varier. et les valeurs peuvent aussi varier.

Le string a traiter pourrait être:
drw-rw-rw- 1 root root 16384 1980-01-01 00:00 appcache

tout comme il pourrait être ceci:
drw-rw-rw- 1 zzzzz abcabcabc 2134354654 200-02-23 12:50 aaaaaaaaaaaaaaaa

Quel code serait le meilleur pour extraire la valeur?. Note: la derniere valeur peut contenir des espaces...ex: appcache pourrait etre app cache.

Merci
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 mars 2011 à 06:41
Fais le test, ca prend deux minutes...

créé une nouvelle solution sous Visual Studio et ajoutes :

using System;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {
            MessageBox.Show(GetFolderName("drw-rw-rw- 1 root root 16384 1980-01-01 00:00 ."));
            MessageBox.Show(GetFolderName("drw-rw-rw- 1 root root 16384 1980-01-01 00:00 appcache"));
            MessageBox.Show(GetFolderName("drw-rw-rw- 1 root root 16384 1980-01-01 00:00 app cache"));
            MessageBox.Show(GetFolderName("drw-rw-rw- 1 zzzzz abcabcabc 2134354654 200-02-23 12:50 aaaaaaaaaaaaaaaa"));
        }

        static String GetFolderName(String vsLine) {
            Regex reg = new Regex(@"(?<=(\S+\s+){7})(.+$)");
            if (reg.IsMatch(vsLine))
                return reg.Match(vsLine).Groups[2].Value;
            return String.Empty;
        }
    }
}





Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
29 mars 2011 à 09:22
Re,

il n'y a pas de différences du nombre d'espaces ou du nombre de valeurs dans tes deux exemples, Razordj ;)

As-tu essayé la regex de Renfield ?
0
Razordj Messages postés 51 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 13 avril 2011
29 mars 2011 à 14:10
J'en ai pas encore eu le temps :/

Mais, quand je post ma phrase a splitter le nombre d'espace entre chaque se réduit a 1...

Mais avec le code de renfield, le nombre d'espace entre chaque ne compte pas?.
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
29 mars 2011 à 14:21
Je t'avouerai que j'ai pas regardé sa regex de près ^^

Et oki pour les espaces supprimés dans les messages du forum, j'y avais pas pensé. Du coup tu avais parfois plusieurs espaces entre deux mots, avec un même nombre de mots ?
0
Razordj Messages postés 51 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 13 avril 2011
29 mars 2011 à 18:52
Euh, meme nombre de mots?

Tu veux dire que dans ce string:
drw-rw-rw- 1 root root 16384 1980-01-01 00:00 appcache

il y aurait 8 mots ?. Si oui, bah ..oui c'est tout le temps le meme nombre de mots :).
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
29 mars 2011 à 19:16
Oui, c'est bien ce que j'appelle des mots ;)

Et donc tu pourrais avoir une ligne comme celle-ci ?
(les espaces sont remplacés par des _ pour pas avoir de souci) :
typeright__nblinks__user_group___size_moddate_modhour____name

Si oui, il faut en tenir compte dans la rédaction de ta regex.
(j'ai toujours pas testé celle de Renfield ^^)
On en reparle demain ;)
0
Razordj Messages postés 51 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 13 avril 2011
29 mars 2011 à 20:04
Oui, ça peut meme aller jusqu'a 8 espaces ;). Mais c'est pas le max.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
30 mars 2011 à 09:04
Testez, vous saurez ^^

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
Rejoignez-nous