3 votes

Analyseur Univocity : TextParsingException lors de l'analyse d'une ligne qui a un guillemet double de départ (") mais qui n'a pas de guillemet double de fin (")

Obtention d'une exception lors de l'analyse du fichier :

com.univocity.parsers.common.TextParsingException: Length of parsed input (4097) exceeds the maximum number of characters defined in your parser settings (4096). 
Identified line separator characters in the parsed content. This may be the cause of the error. The line separator in your parser settings is set to '\r\n'. Parsed content: The quick brown fox jumps over the lazy dog.|[\n]

Contenu du fichier :

1234|5678|The quick brown fox jumps over the lazy dog.|
1234|5678|"The quick brown fox jumps over the lazy dog.|
1234|5678|The quick brown fox jumps over the lazy dog.|
1234|5678|The quick brown fox jumps over the lazy dog.|
1234|5678|The quick brown fox jumps over the lazy dog.|
.........
.........
1234|5678|The quick brown fox jumps over the lazy dog.|

J'utilise les paramètres suivants pour l'analyseur CSV :

CsvParserSettings parserSettings = new CsvParserSettings();
parserSettings.setLineSeparatorDetectionEnabled(true);
parserSettings.getFormat().setDelimiter('|');
parserSettings.setIgnoreLeadingWhitespaces(true);
parserSettings.setIgnoreTrailingWhitespaces(true);
parserSettings.setHeaderExtractionEnabled(false);
parserSettings.setMaxCharsPerColumn(4096);

Ce que je peux déduire de l'exception, c'est que la deuxième ligne commence par un guillemet double ("). Mais la ligne ne se termine pas par le guillemet double ("). Dans ce cas, la longueur de la colonne va jusqu'à EOF (end of file).

Testé avec la version : 2.2.2

2voto

Jeronimo Backes Points 4055

C'est ainsi que l'analyseur CSV est censé fonctionner. Si un guillemet est trouvé, c'est parce que le contenu après le guillemet peut contenir des délimiteurs, des fins de ligne ou d'autres guillemets (espérons-le) échappés.

La seule façon de contourner cette situation dans votre cas est de procéder comme suit :

parserSettings.getFormat().setQuote('\0');

L'analyseur ignorera les guillemets et traitera les valeurs qui en contiennent comme des valeurs sans guillemets. Une fois qu'une fin de ligne ou un délimiteur est trouvé, la valeur sera collectée comme prévu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X