2013-02-11 14 views
9

Quando sto leggendo un file csv usando opencsv, non funziona correttamente quando si incontra un '\' alla fine di una stringa. Rende la "parte della stringa, invece che il \" come voglio.Penso che ci sia un metodo per aggiungere un altro '\' per farlo sfuggire al carattere '\' - invece? Senza .. modificare manualmente il file CSV ho cercato ma non trovato nullaCome leggere una stringa contenente un '' usando opencsv?

Per chiarire il mio problema, sembra che questo:

file CSV

"A",  "B",  "C",  "D" 
"value 1", "value 2", "value 3", "value 4" 
"value 5", "value 6\", "value 7", "value 8" 

il mio codice è simile al seguente (non proprio, ma mostra il mio problema):

String inFile = "in.csv"; 
CSVReader reader = new CSVReader(new FileReader(inFile)); 
String[] line; 

while ((line = reader.readNext()) != null) { 
    for (int i = 0; i < line.length(); i++) { 
     System.out.println(i + " " + line[i]); 
    } 
} 

Voglio che questo si analizzi in una stringa [] con 4 elementi ciascuno, per ogni riga, ma l'ultima riga analizza solo in due elementi, come mostrato nell'output sottostante.

1 A 
2 B 
3 C 
4 D 
1 value 1 
2 value 2 
3 value 3 
4 value 4 
1 value 5 
2 value 6",value 7,value 8 

Ho provato a cambiare il lettore a:

CSVReader reader = new CSVReader(new InputStreamReader(new FileInputStream(inFile), "UTF-8")); 

ma senza alcuna fortuna.

risposta

11

forse cambiare il carattere di escape nel costruttore del lettore?

CSVReader(new InputStreamReader(new FileInputStream(inFile), ',', '"', '|') 

Ciò presuppone | non viene utilizzato nel vostro CVS presentare

Maggiori informazioni qui: http://opencsv.sourceforge.net/apidocs/au/com/bytecode/opencsv/CSVReader.html

+0

Grazie! Ora sono in grado di leggere quella linea come dovrebbe. Tuttavia, ho anche il carattere ** | ** nel file. C'è un modo per saltare il personaggio di fuga? –

+4

Prova ''\ 0''. Penso che questo non sia valido per CVS – user000001

+0

Fantastico! Questo è stato. Molte grazie! –

3

La barra rovesciata serve per sfuggire allo " poiché alcuni valori possono contenere un carattere " e senza la barra rovesciata non è possibile includere il carattere.

Quindi, se si desidera utilizzare \ è necessario sfuggire a esso con \ troppo, proprio come si farebbe per averlo in una normale stringa Java.

"A",  "B",   "C",  "D" 
"value 1", "value 2", "value 3", "value 4" 
"value 5", "value 6\\", "value 7", "value 8" 

O si modifica il file CSV o si utilizza un altro costruttore da CSVReader da cui è possibile scegliere il carattere di escape

+0

E come posso ottenere questo tramite il codice? –

+0

@ChristofferKarlsson vedere la modifica – Alex

+0

L'utente dichiara esplicitamente che non è possibile modificare il CSV. Immagina che si tratti di dati sporchi provenienti da una fonte esterna. –

0

più pulita e soluzione consigliata è quella di utilizzare RFC4180Parser al posto di predefinito CSVParser:

RFC4180Parser rfc4180Parser = new RFC4180ParserBuilder().build(); 
CSVReader csvReader = new CSVReaderBuilder(new StringReader(writer.toString())).withCSVParser(rfc4180Parser).build(); 

Riferimento: https://sourceforge.net/p/opencsv/support-requests/50/

Problemi correlati