Чтение в файлах, которые содержат определенные символы в C # - PullRequest
0 голосов
/ 18 декабря 2009

У меня есть текстовый файл с именем C:/test.txt:

1 2 3 4
5 6

Я хочу прочитать каждое число в этом файле, используя StreamReader.

Как я могу это сделать?

Ответы [ 7 ]

5 голосов
/ 18 декабря 2009

Вам действительно нужно использовать StreamReader для этого?

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

(Очевидно, что нецелесообразно читать весь файл одним ударом, тогда вам нужно будет транслировать его, но если вы сможете использовать File.ReadAllText, то, на мой взгляд, так и есть). 1006 *

Для полноты вот потоковая версия:

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);
            }
        }
    }
}
1 голос
/ 18 декабря 2009

Решение для больших файлов:

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();
    }
}
1 голос
/ 18 декабря 2009

Нечто подобное может сработать, если вы хотите прочитать целые числа из файла и сохранить их в списке.

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 голос
/ 18 декабря 2009
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 голосов
/ 18 декабря 2009

Как-то так должно работать:

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));
}
0 голосов
/ 18 декабря 2009

Примерно так:

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 голосов
/ 18 декабря 2009

Я могу ошибаться, но с StreamReader вы не можете установить разделитель. Но вы можете использовать String.Split (), чтобы установить разделитель (это пробел в вашем случае?) И извлечь все числа в отдельный массив.

...