public static Func <IDataRow> ParseData(this Func <ISourceRow> getLineFunc, IFileConfiguration fileConfig, Interfaces.ILog logger) { if (fileConfig == null) { var msg = Localization.GetLocalizationString("Could not get Source Configuration..."); logger?.Fatal(msg); throw new ArgumentException(msg); } logger?.Info(string.Format(Localization.GetLocalizationString("Parsing data from {0}"), fileConfig.Name)); var parsers = fileConfig.GetRowParsers(); var currentRecord = (long)0; var parsedRecords = (long)0; return(() => { var line = getLineFunc(); if (line != null) { currentRecord++; try { var row = parsers(line, currentRecord, currentRecord); if (row != null) { parsedRecords++; return row; } } catch (Exception ex) { logger?.Error(Localization.GetLocalizationString("Failed to parse line: \"{0}\"", string.Join(",", line.Fields.Select(x => x.Source)))); throw ex; } return new DataRow( new Dictionary <string, IValue> { { "raw", new ValueWrapper <string>(string.Join(",", line.Fields.Select(x => x.Source)), Localization.GetLocalizationString("Parse error"), true, string.Join(",", line.Fields.Select(x => x.Source))) } }, Localization.GetLocalizationString("Could not parse line."), currentRecord, line.LineNumber, line.Context.SourcePath, line.Context.FileConfiguration.Name); } logger?.Info(string.Format(Localization.GetLocalizationString("Parsed {0}/{1} records from {2}"), parsedRecords, currentRecord, fileConfig.Name)); return null; }); }