/ / Parser Opencsv in JAVA, incapace di analizzare le virgolette nei dati - java, csv, opencsv

Parser Opencsv in JAVA, impossibile analizzare le virgolette nei dati - java, csv, opencsv

Ho seguito il file CSV,

"id","Description","vale"
1,New"Account","val1"

Non riesco a leggere il file csv sopra con jar opencsv. Non può leggere New"Account, dal momento che le virgolette all'interno dei dati. Il mio costruttore di csv reader sta seguendo,

csvReader = new CSVReader(new FileReader(currentFile), ",", """, "");

risposte:

1 per risposta № 1

Questo è come progettato. Il tuo costruttore specifica un carattere di citazione come """ così OpenCSV tratterà quel carattere come carattere di citazione, cioè quando leggerà una citazione, ignorerà tutte le virgole finché non verrà trovata una citazione corrispondente.

Per aggirare questo si potrebbe usare a FilterReader.

    Reader reader = new FilterReader(fileReader) {

private int filter(int ch) {
return ch == """?" ":ch;
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
int red = super.read(cbuf, off, len);
for ( int i = off; i < off + red; i++) {
cbuf[i] = (char)filter(cbuf[i]);
}
return red;
}

@Override
public int read() throws IOException {
return filter(super.read());
}

};

2 per risposta № 2

Questo è csv non valido:

1,New"Account","val1"

dovrebbe essere:

1,"New""Account","val1" -> se vuoi 1 New"Account val1

o

1,"New""Account""","val1" -> se vuoi 1 New"Account" val1

Citazioni all'interno dei campi (citati), devono essere sostituiti con un'altra citazione.

Mentre è possibile modificare il codice per leggere ilcsv non corretto correttamente, i dati csv dovrebbero essere corretti in primo luogo, perché potresti ottenere un numero maggiore di errori con file csv più grandi o aggiornamenti di tali dati.

Di solito, le virgolette sono usate quando c'è unseparatore o un'altra citazione all'interno del campo. Quindi, se si ignorano le virgolette e si divide solo sul separatore, ci saranno problemi se c'è un separatore all'interno di un campo nei futuri aggiornamenti dei dati - per esempio:

1,"John, Doe",123