using System; using System.IO; using CsvHelper; namespace LeafWeb.Core.Parsers { public class CsvParserBase : IDisposable { private readonly StreamReader _reader; private readonly MemoryStream _memoryStream; protected readonly CsvReader CsvReader; protected CsvParserBase(FileSystemInfo csvFile, bool ignoreBlankLines) { _reader = OpenCsv(csvFile); CsvReader = InitCsvReader(_reader, ignoreBlankLines); } protected CsvParserBase(byte[] fileContents, bool ignoreBlankLines) { _memoryStream = new MemoryStream(fileContents); _reader = new StreamReader(_memoryStream); CsvReader = InitCsvReader(_reader, ignoreBlankLines); } private static CsvReader InitCsvReader(TextReader reader, bool ignoreBlankLines) { var csvReader = new CsvReader(reader); csvReader.Configuration.HasHeaderRecord = false; csvReader.Configuration.IgnoreBlankLines = ignoreBlankLines; csvReader.Configuration.ReadingExceptionOccurred = exception => false; return csvReader; } internal static StreamReader OpenCsv(FileSystemInfo csvFile) { if (!csvFile.Exists) throw new FileNotFoundException($"Cannot find file '{csvFile.Name}'"); return File.OpenText(csvFile.FullName); } protected string[] GetNextCsvRowValues() { // get values from row if (!CsvReader.Read()) return null; return CsvReader.Context.Record; } public void Dispose() { _reader.Dispose(); _memoryStream?.Dispose(); } } }