0

次の名前のテキストファイルがありますC:/test.txt

1 2 3 4
5 6

を使用して、このファイルのすべての番号を読み取りたいStreamReader

どうやってやるの?

4

7 に答える 7

5

これを行うために a を本当に使用する必要がありますStreamReaderか?

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

(明らかに、ファイル全体を 1 回のヒットで読み取ることが現実的でない場合は、ストリーミングする必要がありますが、使用できる場合は、File.ReadAllTextそれが私の意見です。)

完全を期すために、ストリーミング バージョンを次に示します。

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);
            }
        }
    }
}
于 2009-12-18T13:02:09.633 に答える
1

大きなファイルの解決策:

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();
    }
}
于 2009-12-18T13:00:07.283 に答える
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();
  }

}
于 2009-12-18T12:33:36.960 に答える
1

ファイルから整数を読み取り、それらをリストに格納することが必要な場合は、そのようなことがうまくいくかもしれません。

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
}
于 2009-12-18T12:35:38.253 に答える
0

私は間違っているかもしれませんが、StreamReader では区切り文字を設定できません。ただし、 String.Split() を使用して区切り記号を設定し(あなたの場合はスペースですか?)、すべての数値を個別の配列に抽出できます。

于 2009-12-18T12:29:10.263 に答える
0

このようなもの:

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());
    }
}
}
于 2009-12-18T12:30:59.940 に答える
0

このようなものはうまくいくはずです:

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));
}
于 2009-12-18T12:32:12.467 に答える