private static void SetupErrorHandlers(Action <ImportProgressInfo> progressCallback, CsvConfiguration configuration, ImportErrorsContext errorsContext, ImportProgressInfo importProgress, ICsvPriceImportReporter importReporter) { configuration.ReadingExceptionOccurred = args => { var context = args.Exception.Context; if (!errorsContext.ErrorsRows.Contains(context.Parser.Row)) { var fieldSourceValue = context.Reader[context.Reader.CurrentIndex]; if (context.Reader.HeaderRecord.Length != context.Parser.Record.Length) { HandleNotClosedQuoteError(progressCallback, importProgress, importReporter, context, errorsContext); } else if (fieldSourceValue == "") { HandleRequiredValueError(progressCallback, importProgress, importReporter, context, errorsContext); } else { HandleWrongValueError(progressCallback, importProgress, importReporter, context, errorsContext); } } return(false); }; configuration.BadDataFound = args => { HandleBadDataError(progressCallback, importProgress, importReporter, args.Context, errorsContext); }; configuration.MissingFieldFound = args => HandleMissedColumnError(progressCallback, importProgress, importReporter, args.Context, errorsContext); }
private static void HandleMissedColumnError(Action <ImportProgressInfo> progressCallback, ImportProgressInfo importProgress, ICsvPriceImportReporter reporter, CsvContext context, ImportErrorsContext errorsContext) { var headerColumns = context.Reader.HeaderRecord; var recordFields = context.Parser.Record; var missedColumns = headerColumns.Skip(recordFields.Length).ToArray(); var error = $"This row has next missing columns: {string.Join(", ", missedColumns)}."; var importError = new ImportError { Error = error, RawRow = context.Parser.RawRecord }; reporter.Write(importError); errorsContext.ErrorsRows.Add(context.Parser.Row); HandleError(progressCallback, importProgress); }
private static void HandleRequiredValueError(Action <ImportProgressInfo> progressCallback, ImportProgressInfo importProgress, ICsvPriceImportReporter reporter, CsvContext context, ImportErrorsContext errorsContext) { var fieldName = context.Reader.HeaderRecord[context.Reader.CurrentIndex]; var requiredFields = CsvPriceImportHelper.GetImportPriceRequiredValueColumns(); var missedValueColumns = new List <string>(); for (var i = 0; i < context.Reader.HeaderRecord.Length; i++) { if (requiredFields.Contains(context.Reader.HeaderRecord[i], StringComparer.InvariantCultureIgnoreCase) && context.Parser.Record[i].IsNullOrEmpty()) { missedValueColumns.Add(context.Reader.HeaderRecord[i]); } } var importError = new ImportError { Error = $"The required value in column {fieldName} is missing.", RawRow = context.Parser.RawRecord }; if (missedValueColumns.Count > 1) { importError.Error = $"The required values in columns: {string.Join(", ", missedValueColumns)} - are missing."; } reporter.Write(importError); errorsContext.ErrorsRows.Add(context.Parser.Row); HandleError(progressCallback, importProgress); }
private static void HandleWrongValueError(Action <ImportProgressInfo> progressCallback, ImportProgressInfo importProgress, ICsvPriceImportReporter reporter, CsvContext context, ImportErrorsContext errorsContext) { var invalidFieldName = context.Reader.HeaderRecord[context.Reader.CurrentIndex]; var importError = new ImportError { Error = $"This row has invalid value in the column {invalidFieldName}.", RawRow = context.Parser.RawRecord }; reporter.Write(importError); errorsContext.ErrorsRows.Add(context.Parser.Row); HandleError(progressCallback, importProgress); }
private static void HandleNotClosedQuoteError(Action <ImportProgressInfo> progressCallback, ImportProgressInfo importProgress, ICsvPriceImportReporter reporter, CsvContext context, ImportErrorsContext errorsContext) { var importError = new ImportError { Error = "This row has invalid data. Quotes should be closed.", RawRow = context.Parser.RawRecord }; reporter.Write(importError); errorsContext.ErrorsRows.Add(context.Parser.Row); HandleError(progressCallback, importProgress); }
private static void HandleBadDataError(Action <ImportProgressInfo> progressCallback, ImportProgressInfo importProgress, ICsvPriceImportReporter reporter, CsvContext context, ImportErrorsContext errorsContext) { var importError = new ImportError { Error = "This row has invalid data. The data after field with not escaped quote was lost.", RawRow = context.Parser.RawRecord }; reporter.Write(importError); if (context.Reader is VcCsvReader vcCsvReader) { vcCsvReader.IsFieldBadData = true; } errorsContext.ErrorsRows.Add(context.Parser.Row); HandleError(progressCallback, importProgress); }