Чтение из файла по одному числу, c#

242
03 октября 2018, 17:40

Столкнулся с такой проблемой: есть файл на миллион чисел, разделенных пробелом (одной строкой). Можно ли как-то читать числа по одному? Потому что чтение строки целиком очень нагружает память. Пробовал через StreamReader.Read, но он считывает посимвольно. Конечно, можно читать символы пока не встречу пробел и складывать из них числа, но это кажется не очень красивым вариантом, может есть методы специально для такого? Заранее спасибо за советы.

Answer 1

Напишем нехитрую функцию для чтения из потока

public IEnumerable<int> ReadNumbers(Stream st)
{
    var buffer = new StringBuilder();
    using (var sr = new StreamReader(st))
    {
        while(!sr.EndOfStream)
        {
            char digit = (char)sr.Read();
            if (!char.IsDigit(digit))
            {
                if (buffer.Length == 0) continue;
                int ret = Int32.Parse(buffer.ToString());
                buffer.Clear();
                yield return  ret;
            }
            else {
                buffer.Append(digit);
            }
        }
        if (buffer.Length != 0)
        {
            int ret = Int32.Parse(buffer.ToString());
            buffer.Clear();
            yield return ret;
        }
    }
}

Чтобы читать файл побайтово

foreach(var n in ReadNumbers(File.OpenRead(@"D:\temp\sample.txt")))
    Console.WriteLine(n);

Чтобы читать файл с буфером в мегабайт

foreach (var n in 
           ReadNumbers(
              new BufferedStream(
                   File.OpenRead(@"D:\temp\sample.txt"), 
                   1024 * 1024)))
    Console.WriteLine(n);
READ ALSO
Валидация имён узлов xml-документа

Валидация имён узлов xml-документа

Имеется возможность добавлять объекты с пользовательским именем (textBox + AddButton) в списокДалее, на основе имен этих объектов будут генерироваться...

179
Создание массивов из текста

Создание массивов из текста

У меня например есть строка

153
jQuery - картинки по одному пути

jQuery - картинки по одному пути

Сегодня я столкнулся с проблемойЯ загружаю на свой сайт картинку, процесс сохранения работает исправно

141
Реализация авторизации на cookies + session + db

Реализация авторизации на cookies + session + db

В случае успеха происходит процесс авторизации (создание необходимых связей cookies + session + db)Обратите внимание, что в db тоже должна быть связь...

173