private IEnumerable <FinancialRatio> ExtractRatios( string stockName, IEnumerable <string> allLines, IEnumerable <string> datesString, FinancialRatioSectionEnum section, int fromLine, int toLine) { for (int lineNumber = fromLine; lineNumber <= toLine; lineNumber++) { // ReSharper disable once PossibleMultipleEnumeration var ratio = allLines.ElementAt(lineNumber); using (var csvParser = new TextFieldParser(new StringReader(ratio)) { Delimiters = new[] { "," } }) { csvParser.Delimiters = new[] { "," }; var fields = csvParser.ReadFields(); if (fields != null) { var ratioName = fields[0]; var ratioData = fields.Skip(1).Select(x => !string.IsNullOrEmpty(x) ? double.Parse(x) : (double?)null).ToList(); // ReSharper disable once StyleCop.SA1305 var pChange = Enumerable.Range(0, ratioData.Count).Select( i => { if (i == 0) { return(null); } if (ratioData.ElementAt(i - 1) == null) { return(null); } return((ratioData.ElementAt(i) - ratioData.ElementAt(i - 1)) / ratioData.ElementAt(i - 1) * 100.0); }); var tup = Enumerable.Range(0, ratioData.Count) .Select( i => Tuple.Create(datesString.ElementAt(i), ratioData.ElementAt(i), pChange.ElementAt(i))) .ToList(); yield return (new FinancialRatio { StockName = stockName, Section = section, Name = ratioName, Data = tup }); } } } }
private IEnumerable <FinancialRatio> ExtractFinancials( string stockName, IEnumerable <string> allLines, IEnumerable <string> datesString, FinancialRatioSectionEnum section) { foreach (var line in allLines) { using (var csvParser = new TextFieldParser(new StringReader(line)) { Delimiters = new[] { "," } }) { csvParser.Delimiters = new[] { "," }; var fields = csvParser.ReadFields(); if (fields == null || fields.Length < 2) { continue; } var quantityName = fields[0]; var quantityData = fields.Skip(1).Select(x => !string.IsNullOrEmpty(x) ? double.Parse(x) : (double?)null).ToList(); // ReSharper disable once StyleCop.SA1305 var pChange = Enumerable.Range(0, quantityData.Count).Select( i => { if (i == 0) { return(null); } if (quantityData.ElementAt(i - 1) == null) { return(null); } return((quantityData.ElementAt(i) - quantityData.ElementAt(i - 1)) / quantityData.ElementAt(i - 1) * 100.0); }); var tup = Enumerable.Range(0, quantityData.Count) .Select( i => Tuple.Create(datesString.ElementAt(i), quantityData.ElementAt(i), pChange.ElementAt(i))) .ToList(); yield return (new FinancialRatio { StockName = stockName, Section = section, Name = quantityName, Data = tup }); } } }
private IEnumerable <FinancialRatio> ProcessFinancials(string data, FinancialRatioSectionEnum type) { var result = new List <FinancialRatio>(); try { var allLines = data.Split(new[] { "\n" }, StringSplitOptions.None).ToList(); var stockName = allLines.ElementAt(0) .Split(new[] { "(" }, StringSplitOptions.RemoveEmptyEntries) .ElementAt(0) .TrimStart(); allLines.RemoveAt(0); var datesString = allLines.ElementAt(0).Split(new[] { "," }, StringSplitOptions.None).Skip(1); result.AddRange(this.ExtractFinancials(stockName, allLines.Skip(1), datesString, type)); } catch (Exception) { // ignored } return(result); }