using System.Collections.Generic; using System.IO; using System.Linq; using LeafWeb.Core.Entities; using LeafWeb.Core.Utility; namespace LeafWeb.Core.Parsers { public class LeafGasComparisonParser : CsvParserBase { public LeafGasComparisonParser(FileSystemInfo csvFile) : base(csvFile) { } public LeafGasComparisonParser(byte[] fileContents) : base(fileContents) { } public LeafGasComparison[] Parse() { var fittingTitles = GetNextCsvRowValues(); if (fittingTitles == null) throw new ParseException($"Could not read data header row on line number {CsvReader.Row}"); var fitUnits = GetNextCsvRowValues(); if (fitUnits == null) throw new ParseException($"Could not read data units row on line number {CsvReader.Row}"); return ParseLeafGasComparisonSet(fittingTitles).ToArray(); } private IEnumerable ParseLeafGasComparisonSet(string[] fittingTitles) { var endOfFile = false; while (!endOfFile) { // First Section var fittingValues = new List(); string[] photosyntheticTitles; while (true) { var values = GetNextCsvRowValues(); if (CsvReader.IsRecordEmpty()) throw new ParseException($"Encountered empty line while readding fitting info on line {CsvReader.Row}"); if (values == null) // end of file yield break; if (ParsedObjectFactory.IsPropertiesTitlesMatch(values)) { photosyntheticTitles = values; break; } fittingValues.Add(values); } var photosyntheticValues = new List(); while (true) { var values = GetNextCsvRowValues(); if (CsvReader.IsRecordEmpty()) // end of set break; if (values == null) { endOfFile = true; break; } photosyntheticValues.Add(values); } var fittingInfo = ParsedObjectFactory .Create(fittingTitles, fittingValues.ToArray()); var photosyntheticInfo = ParsedObjectFactory .Create(photosyntheticTitles, photosyntheticValues.ToArray()); yield return new LeafGasComparison { FittingInfo = fittingInfo, PhotosyntheticInfo = photosyntheticInfo }; } } } }