Необходимо написать быстрый парсер CSV данных с минимальным потреблением памяти.
Парсер должен принимать на вход string или Stream с указанием кодировки. Парсер должен оптимально работать с памятью на основе данного подхода
stackoverflow.com/a/13342... Замечания к коду по ссылке (применительно только к разделению строчек, для разделения на колонки подход описывается в след абзаце):
1) Сделать его в linq стиле с отложенным чтением строчки за строчкой (основной упор минимальное потребление памяти)
2) splitChar сделать ввиде строки с поддержкой разделения не только одним символом
3) сделать опцию убирать или не убирать пустые элементы (в коде сейчас всегда убирается)
Парсер должен преобразовывать самостоятельно строки в типы данных (string, byte, bool, int, long, decimal, DateTime, TimeSpan, DateTimeOffset и enum). Для
того используется подход, когда вызывающий код заранее знает о структуре данных, вызывая нужные методы:
CsvParser
{
int ReadInt();
long ReadBool(); // True, False
DateTime ReadDateTime(string format);
T ReadEnum<T>();
bool MoveNext();
CsvParser(string rowSeparator, string columnSeparator);
}
Код методов чтения должен быть реализован так, что он читает посимвольно и напрямую преобразовывает char в нужные типы. Например быстрое преобразование строки в int
cc.davelozinski.com/c-sha... Аналогичный подход и с другими типами.
Изменение структуры класса допускается и обсуждается, если для увеличения производительности необходимо будет перед чтением зарегистрировать допустимые данные.
Как результат нужен парсер + юнит тесты (прямая проверка, обработка ошибок, нагрузка).