From a447f8b0832c8342f31b841fc9df74197d0b17bb Mon Sep 17 00:00:00 2001 From: Raphael Noeldner Date: Thu, 3 Aug 2023 12:57:03 +0200 Subject: [PATCH] Do not support Escaping when using duplicateQualifier --- Library/ClassLibraryCSV/CsvHelper.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Library/ClassLibraryCSV/CsvHelper.cs b/Library/ClassLibraryCSV/CsvHelper.cs index 3259c21f..6da327d9 100644 --- a/Library/ClassLibraryCSV/CsvHelper.cs +++ b/Library/ClassLibraryCSV/CsvHelper.cs @@ -529,14 +529,12 @@ InspectionResult defaultInspectionResult var newCommentLine = await textReader.InspectLineCommentAsync(cancellationToken).ConfigureAwait(false); inspectionResult.CommentLine = newCommentLine; } - + var newPrefix = inspectionResult.EscapePrefix; if (guessEscapePrefix) // Dependent on SkipRows, FieldDelimiter and FieldQualifier { Logger.Information("Checking Escape Prefix"); using var textReader = await stream.GetTextReaderAsync(inspectionResult.CodePageId, inspectionResult.SkipRows, cancellationToken); - var newPrefix = await textReader.InspectEscapePrefixAsync(inspectionResult.FieldDelimiter, inspectionResult.FieldQualifier, cancellationToken); - changedEscapePrefix = (inspectionResult.EscapePrefix != newPrefix); - inspectionResult.EscapePrefix = newPrefix; + newPrefix = await textReader.InspectEscapePrefixAsync(inspectionResult.FieldDelimiter, inspectionResult.FieldQualifier, cancellationToken); } if (guessQualifier || guessDelimiter || guessNewLine) @@ -547,11 +545,15 @@ InspectionResult defaultInspectionResult { cancellationToken.ThrowIfCancellationRequested(); Logger.Information("Checking Qualifier"); - var qualifierTestResult = textReader.InspectQualifier(inspectionResult.FieldDelimiter, inspectionResult.EscapePrefix, new[] { '"', '\'' }, cancellationToken); + var qualifierTestResult = textReader.InspectQualifier(inspectionResult.FieldDelimiter, newPrefix, new[] { '"', '\'' }, cancellationToken); changedFieldQualifier = inspectionResult.FieldQualifier != qualifierTestResult.QuoteChar; inspectionResult.FieldQualifier = qualifierTestResult.QuoteChar; inspectionResult.ContextSensitiveQualifier = !(qualifierTestResult.DuplicateQualifier || qualifierTestResult.EscapedQualifier); inspectionResult.DuplicateQualifierToEscape = qualifierTestResult.DuplicateQualifier; + + // In case we have DuplicateQualifier turn off EscapePrefix + if (inspectionResult.DuplicateQualifierToEscape) + newPrefix = char.MinValue; } if (guessDelimiter) // Dependent on SkipRows, FieldQualifier and EscapePrefix @@ -559,7 +561,7 @@ InspectionResult defaultInspectionResult cancellationToken.ThrowIfCancellationRequested(); Logger.Information("Checking Column Delimiter"); var delimiterDet = await textReader.InspectDelimiterAsync( - inspectionResult.FieldQualifier, inspectionResult.EscapePrefix, disallowedDelimiter, cancellationToken).ConfigureAwait(false); + inspectionResult.FieldQualifier, newPrefix, disallowedDelimiter, cancellationToken).ConfigureAwait(false); if (delimiterDet.MagicKeyword) inspectionResult.SkipRows++; changedDelimiter = inspectionResult.FieldDelimiter != delimiterDet.Delimiter; @@ -576,6 +578,10 @@ InspectionResult defaultInspectionResult } } + changedEscapePrefix = (inspectionResult.EscapePrefix != newPrefix); + if (changedEscapePrefix) + inspectionResult.EscapePrefix = newPrefix; + if (guessEscapePrefix && (changedDelimiter || changedFieldQualifier) && tryCount<5) { Logger.Information("Re-Checking: Field Delimiter or Field Qualifier changed");