web-dev-qa-db-fra.com

Caractère non valide entre le jeton encapsulé et le délimiteur dans la bibliothèque CSV Apache Commons

J'obtiens l'erreur suivante lors de l'analyse du fichier CSV à l'aide de la bibliothèque Apache Commons CSV .

Exception in thread "main" Java.io.IOException: (line 2) invalid char between encapsulated token and delimiter

at org.Apache.commons.csv.Lexer.parseEncapsulatedToken(Lexer.Java:275)
at org.Apache.commons.csv.Lexer.nextToken(Lexer.Java:152)
at org.Apache.commons.csv.CSVParser.nextRecord(CSVParser.Java:450)
at org.Apache.commons.csv.CSVParser.getRecords(CSVParser.Java:327)
at parse.csv.file.CSVFileParser.main(CSVFileParser.Java:29)

Quelle est la signification de cette erreur?

26
Santhosh Sridhar

Nous avons rencontré ce problème lorsque nous avions intégré un devis dans nos données.

0,"020"1,"BS:5252525  ORDER:99999"4

La solution appliquée était CSVFormat csvFileFormat = CSVFormat.DEFAULT.withQuote(null);

Le conseil de @Cuga nous a aidés à résoudre. Merci @Cuga

Le code complet est

    public static void main(String[] args) throws IOException {
    FileReader fileReader = null;
    CSVFormat csvFileFormat = CSVFormat.DEFAULT.withQuote(null);
    String fileName = "test.csv";

    fileReader = new FileReader(fileName);
    CSVParser csvFileParser = new CSVParser(fileReader, csvFileFormat);

    List<CSVRecord> csvRecords = csvFileParser.getRecords();

    for (CSVRecord csvRecord : csvRecords) {
        System.out.println(csvRecord);
    }
    csvFileParser.close();
}

Le résultat est

CSVRecord [comment=null, mapping=null, recordNumber=1, values=[0, "020"1, "BS:5252525  ORDER:99999"4]]
36
Anand

Cette ligne dans le fichier CSV contient un caractère non valide entre l'une de vos cellules et la fin de la ligne, la fin du fichier ou la cellule suivante. Une cause très courante à cela est le fait de ne pas échapper à votre caractère d'encapsulation (le caractère utilisé pour "encapsuler" chaque cellule, donc CSV sait où commence et se termine une cellule (jeton).

8
Steve Siebert

J'ai trouvé la solution au problème. Un de mes fichiers CSV a un attribut comme suit: "attribut avec" devis "imbriqué

En raison d'une citation imbriquée dans l'attribut, l'analyseur échoue.

Pour éviter le problème ci-dessus, échappez au devis imbriqué comme suit: "attribut avec" "" "devis" "" "" =

C'est la seule façon de résoudre le problème.

7
Santhosh Sridhar

Nous avons rencontré cela dans cette même erreur avec des données contenant des guillemets dans une entrée autrement non cotée. C'est à dire.:

some cell|this "cell" caused issues|other data

C'était difficile à trouver, mais dans Apache's docs , ils mentionnent la méthode withQuote() qui peut prendre null comme valeur.

Nous recevions exactement le même message d'erreur et cela (heureusement) a fini par résoudre le problème pour nous.

2
Cuga