2009-08-03 6 views
0

J'analyse mon dossier /etc/passwd, qui ressemble à ceci:Parsing fichier pour obtenir la liste des noms en C#

root:x:0:0:root:/root:/bin/bash 
bin:x:1:1:bin:/bin:/sbin/nologin 
daemon:x:2:2:daemon:/sbin:/sbin/nologin 
adm:x:3:4:adm:/var/adm:/sbin/nologin 
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 
sync:x:5:0:sync:/sbin:/bin/sync 

Je veux que mon programme pour retourner les éléments suivants:

root 
bin 
daemon 
... 
sync 

Mon actuelle Code est la suivante:

Regex expression = new Regex(@"^\w*"); 
foreach (Match myMatch in expression.Matches(txt)) 
{ 
    txtout.Text = myMatch.ToString();  
} 

Mais, je ne root revenir avec ce code. Comment puis-je retourner chaque ligne?

+2

me donne la force ...! –

+0

Si vous ne pouvez pas mettre une question décente, comment voulez-vous obtenir des réponses décentes ??? –

+0

Zimzim, comment obtenez-vous 'txt'? Contient-il des sauts de ligne? –

Répondre

0

Si vous ajoutez le paramètre RegexOption qui spécifie que vous souhaitez utiliser le support multiligne, vous obtiendrez chaque ligne. Je ne le sais pas du haut de ma tête, je pense que cela fait partie de l'énumération RegexOptions.

Cordialement,

Sebastiaan

0

Vous devez évidemment faire une boucle sur chaque ligne dans le fichier plutôt que de regarder le contenu du fichier dans son ensemble (comme une chaîne). Est-ce mono?

Regex expression = new Regex(@"^\w*"); 
var passwd = new StreamReader("/etc/passwd"); 
var users = new List<string>(); 
while (passwd.Peek() >= 0) 
{ 
    var line = passwd.ReadLine(); 
    foreach (Match myMatch in expression.Matches(txt)) 
    { 
     users.Add(myMatch.ToString()); 
    } 
} 

// now users will contain all the users in the file 
5

utilisant l'expression rationnelle est un surpuissant, si je comprends votre intention correctement que vous souhaitez récupérer la sous-chaîne avant le premier caractère ':'.

using (StreamReader reader = new StreamReader ("/etc/passwd")) { 
    string line = ""; 
    while((line = reader.ReadLine()) != null) { 
     string userName = line.Substring(0, line.IndexOf(':')); 
    } 
} 
+0

@arul, je l'utilise mais je reçois cette erreur: Impossible de créer une instance de la classe abstraite ou de l'interface System.IO.TextReader ', je veux que l'utilisateur remplisse someStream avec textbox, – zimzim

+0

Oups, désolé, a écrit le code sur le dessus de ma tête, maintenant ça devrait bien fonctionner. – arul

+0

J'ai utilisé ce code mais seulement me renvoyer: synchronisation – zimzim

0
var names = File.ReadAllLines(fileName) 
       .Select(line => line.Substring(0, line.IndexOf(':'))); 
Questions connexes