2010-10-20 9 views
2

Je travaille sur une application qui obtient du texte à partir d'un fichier texte sur une page. lien Exemple:http://test.com/textfile.txtC# manipulation de chaînes

Ce fichier texte contient le texte suivant:

1 Milk Stuff1.rar 
2 Milk Stuff2.rar 
3 Milk Stuff2-1.rar 
4 Union Stuff3.rar 

Ce que je suis en train de faire est la suivante, pour enlever tout de chaque ligne, à l'exception des « mots » qui commencent avec 'Stuff' et se termine par '.rar'.

Le problème est que la plupart des solutions simples comme .Remove, .Split ou .Replace échouent. En effet, par exemple, le formatage de la chaîne en utilisant des espaces finit par retourner ceci:

1 
Milk 
Stuff1.rar\n2 
Milk 
Stuff2.rar\n3 
Milk 
Stuff2-1.rar\n4 
Union 
Stuff3.rar\n 

Je parie que ce n'est pas aussi difficile que cela semble, mais j'apreciate toute aide que vous pouvez me donner.

Ps: Pour être clair, ce que je veux revenir:

Stuff1.rar 
Stuff2.rar 
Stuff2-1.rar 
Stuff3.rar 

Je travaille actuellement avec ce code:

  client.HeadOnly = true; 
      string uri = "http://test.com/textfile.txt"; 

      byte[] body = client.DownloadData(uri); 
      string type = client.ResponseHeaders["content-type"]; 
      client.HeadOnly = false; 

      if (type.StartsWith(@"text/")) 
      { 
       string[] text = client.DownloadString(uri); 

       foreach (string word in text) 
       { 
        if (word.StartsWith("Patch") && word.EndsWith(".rar")) 
        { 
         listBox1.Items.Add(word.ToString()); 
        } 
       } 
      } 

Ceci est de toute évidence ne fonctionne pas, mais vous avoir l'idée.

Merci d'avance!

+0

Pensez à une solution basée sur une expression régulière. – Kangkan

Répondre

5

Cela devrait fonctionner:

 using (var writer = File.CreateText("output.txt")) 
     { 
      foreach (string line in File.ReadAllLines("input.txt")) 
      { 
       var match = Regex.Match(line, "Stuff.*?\\.rar"); 

       if (match.Success) 
        writer.WriteLine(match.Value); 
      } 
     } 
+0

Merci beaucoup! Je ne savais pas que vous pourriez utiliser des caractères génériques dans regex, ce qui fait beaucoup de sens. : D Je marquerai ceci comme réponse dès que je suis autorisé à le faire. Merci pour la réponse rapide. – Nick

2

Je serais tenté d'utiliser une expression régulière pour ce genre de chose.

Quelque chose comme

Stuff[^\s]*.rar 

retirerai tout le texte dont vous avez besoin.

Que diriez-vous d'une fonction comme:

public static IEnumerable<string> GetStuff(string fileName) 
{ 
    var regex = new Regex(@"Stuff[^\s]*.rar"); 
    using (var reader = new StreamReader(fileName)) 
    { 
     string line; 
     while ((line = reader.ReadLine()) != null) 
     { 
      var match = regex.Match(line); 
      if (match.Success) 
      { 
       yield return match.Value; 
      } 
     } 
    } 
} 
+0

Merci pour l'aide, j'ai décidé d'utiliser le code ci-dessus parce que ça marche et que ça ne prend pas beaucoup de place. Mais merci encore, je l'apprécie. – Nick

+0

Pas de problème - le fait que vous receviez souvent plusieurs suggestions et que vous ayez à choisir le plus pertinent est l'une des forces de SO à mon humble avis. –

0
for(string line in text) 
{ 
    if(line.EndsWith(".rar")) 
    { 
     int index = line.LastIndexOf("Stuff"); 
     if(index != -1) 
     { 
      listBox1.Items.Add(line.Substring(index)); 
     } 
    } 
}