in src/main/java/com/univocity/parsers/csv/CsvParser.java [293:391]
private void parseQuotedValue() {
if (prev != '\0' && parseUnescapedQuotesUntilDelimiter) {
if (quoteHandling == SKIP_VALUE) {
skipValue();
return;
}
if (!keepQuotes) {
output.appender.prepend(quote);
}
ch = input.nextChar();
output.trim = ignoreTrailingWhitespace;
ch = output.appender.appendUntil(ch, input, delimiter, newLine);
} else {
if (keepQuotes && prev == '\0') {
output.appender.append(quote);
}
ch = input.nextChar();
if (trimQuotedLeading && ch <= ' ' && output.appender.length() == 0) {
while ((ch = input.nextChar()) <= ' ') ;
}
while (true) {
if (prev == quote && (ch <= ' ' && whitespaceRangeStart < ch || ch == delimiter || ch == newLine)) {
break;
}
if (ch != quote && ch != quoteEscape) {
if (prev == quote) { //unescaped quote detected
if (handleUnescapedQuote()) {
if (quoteHandling == SKIP_VALUE) {
break;
} else {
return;
}
} else {
return;
}
}
if (prev == quoteEscape && quoteEscape != '\0') {
output.appender.append(quoteEscape);
}
ch = output.appender.appendUntil(ch, input, quote, quoteEscape, escapeEscape);
prev = ch;
ch = input.nextChar();
} else {
processQuoteEscape();
prev = ch;
ch = input.nextChar();
if (unescaped && (ch == delimiter || ch == newLine)) {
return;
}
}
}
// handles whitespaces after quoted value: whitespaces are ignored. Content after whitespaces may be parsed if 'parseUnescapedQuotes' is enabled.
if (ch != delimiter && ch != newLine && ch <= ' ' && whitespaceRangeStart < ch) {
whitespaceAppender.reset();
do {
//saves whitespaces after value
whitespaceAppender.append(ch);
ch = input.nextChar();
//found a new line, go to next record.
if (ch == newLine) {
if (keepQuotes) {
output.appender.append(quote);
}
return;
}
} while (ch <= ' ' && whitespaceRangeStart < ch);
//there's more stuff after the quoted value, not only empty spaces.
if (ch != delimiter && parseUnescapedQuotes) {
if (output.appender instanceof DefaultCharAppender) {
//puts the quote before whitespaces back, then restores the whitespaces
output.appender.append(quote);
((DefaultCharAppender) output.appender).append(whitespaceAppender);
}
//the next character is not the escape character, put it there
if (parseUnescapedQuotesUntilDelimiter || ch != quote && ch != quoteEscape) {
output.appender.append(ch);
}
//sets this character as the previous character (may be escaping)
//calls recursively to keep parsing potentially quoted content
prev = ch;
parseQuotedValue();
} else if (keepQuotes) {
output.appender.append(quote);
}
} else if (keepQuotes) {
output.appender.append(quote);
}
if (ch != delimiter && ch != newLine) {
throw new TextParsingException(context, "Unexpected character '" + ch + "' following quoted value of CSV field. Expecting '" + delimiter + "'. Cannot parse CSV input.");
}
}
}