2009-12-18 12 views
0

Je dispose d'un fichier texte nommé C:/test.txt:lecture dans des fichiers qui contiennent des caractères spécifiques en C#

 
1 2 3 4 
5 6 

Je veux lire chaque numéro dans ce fichier en utilisant StreamReader.

Comment puis-je faire cela?

+0

est-ce que le fichier * contiennent seulement * numéros, ou pourrait-il y avoir d'autres personnages? –

+0

Votre question ne semble pas liée à votre exemple. Les nombres ne sont pas des caractères spéciaux ... – James

Répondre

5

Avez-vous vraiment besoin d'utiliser un StreamReader pour ce faire?

IEnumerable<int> numbers = 
    Regex.Split(File.ReadAllText(@"c:\test.txt"), @"\D+").Select(int.Parse); 

(Il est évident que si elle est impossible de lire le fichier entier en un seul coup, vous aurez besoin de le diffuser, mais si vous êtes en mesure d'utiliser File.ReadAllText alors c'est la façon de le faire, à mon avis.)

Pour être complet, voici une version en streaming:

public IEnumerable<int> GetNumbers(string fileName) 
{ 
    using (StreamReader sr = File.OpenText(fileName)) 
    { 
     string line; 
     while ((line = sr.ReadLine()) != null) 
     { 
      foreach (string item in Regex.Split(line, @"\D+")) 
      { 
       yield return int.Parse(item); 
      } 
     } 
    } 
} 
0

Je peux me tromper mais avec StreamReader vous ne pouvez pas définir de délimiteur. Mais vous pouvez utiliser String.Split() pour définir delimeter (c'est de l'espace dans votre cas?) Et extraire tous les nombres dans un tableau séparé.

0

Quelque chose comme ceci:

using System; 
using System.IO; 

class Test 
{ 

    public static void Main() 
{ 
    string path = @"C:\Test.txt"; 

    try 
    { 
     if(File.Exists(path)) 
     { 
     using(StreamReader sr = new StreamReader(path)) 
     { 
      while(sr.Peek() >= 0) 
      { 
      char c = (char)sr.Read(); 
      if(Char.IsNumber(c)) 
       Console.Write(c); 
      } 
     } 
     } 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine("The process failed: {0}", e.ToString()); 
    } 
} 
} 
+0

Euh ... Peut-être qu'il me manque quelque chose ici (il fait froid et mon cerveau n'aime pas le froid). Pourquoi supprimez-vous le fichier d'entrée, puis essayez de l'ouvrir? – ZombieSheep

+0

ahah you'r droite xD j'écrivais vite et intellisense fait la blague :) – Salv0

0

Quelque chose comme cela devrait fonctionner:

using (var sr = new StreamReader("C:/test.txt")) 
{ 
    var s = sr.ReadToEnd(); 
    var numbers = (from x in s.Split('\n') 
        from y in x.Split(' ') 
        select int.Parse(y)); 
} 
1
using (StreamReader reader = new StreamReader(stream)) 
{ 
    string contents = reader.ReadToEnd(); 

    Regex r = new Regex("[0-9]"); 

    Match m = r.Match(contents); 

    while (m.Success) 
    { 
    int number = Convert.ToInt32(match.Value); 

    // do something with the number 

    m = m.NextMatch(); 
    } 

} 
+0

bonne réponse, mais slooow – bniwredyc

+0

je veux dire la solution est lente pas la réponse (% – bniwredyc

1

Quelque chose comme si pourrait faire l'affaire, si ce que vous voulez est de lire des entiers d'un fichier et stockez-les dans une liste.

try 
{ 
    StreamReader sr = new StreamReader("C:/test.txt")) 
    List<int> theIntegers = new List<int>(); 
    while (sr.Peek() >= 0) 
    theIntegers.Add(sr.Read()); 
    sr.Close(); 
} 
catch (Exception e) 
{ 
    //Do something clever to deal with the exception here 
} 
1

Solution pour les grands fichiers:

class Program 
{ 
    const int ReadBufferSize = 4096; 

    static void Main(string[] args) 
    { 
     var result = new List<int>(); 

     using (var reader = new StreamReader(@"c:\test.txt")) 
     { 
      var readBuffer = new char[ReadBufferSize]; 
      var buffer = new StringBuilder(); 

      while ((reader.Read(readBuffer, 0, readBuffer.Length)) > 0) 
      { 
       foreach (char c in readBuffer) 
       { 
        if (!char.IsDigit(c)) 
        { 
         // we found non digit character 
         int newInt; 
         if (int.TryParse(buffer.ToString(), out newInt)) 
         { 
          result.Add(newInt); 
         } 

         buffer.Remove(0, buffer.Length); 
        } 
        else 
        { 
         buffer.Append(c); 
        } 
       } 
      } 

      // check buffer 
      if (buffer.Length > 0) 
      { 
       int newInt; 
       if (int.TryParse(buffer.ToString(), out newInt)) 
       { 
        result.Add(newInt); 
       } 
      } 
     } 

     result.ForEach(Console.WriteLine); 
     Console.ReadKey(); 
    } 
}