2014-12-05 6 views
41

ho ricevuto questo messaggio di errore accade quando sto cercando di leggere un file CSV:alcun mapping colpo di testa viene specificato, i valori record non sono accessibili per nome (Apache Commons CSV)

Exception in thread "main" java.lang.IllegalStateException: No header mapping was specified, the record values can't be accessed by name 
at org.apache.commons.csv.CSVRecord.get(CSVRecord.java:99) 
at mockdata.MockData.main(MockData.java:33) 

Java Risultato: 1

Sto usando Apache Commons CSV library 1.1. Ho cercato su google il messaggio di errore e l'unica cosa che ottengo è la lista di codici su siti come grepcode.

Ecco il mio codice:

package mockdata; 

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.Reader; 
import org.apache.commons.csv.CSVFormat; 
import org.apache.commons.csv.CSVRecord; 

public class MockData 
{ 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) throws FileNotFoundException, IOException 
    { 
     Reader in = new InputStreamReader(MockData.class.getClassLoader() 
           .getResourceAsStream("MOCK_DATA.csv"), "UTF-8"); 
     Iterable<CSVRecord> records = CSVFormat.EXCEL.parse(in); 
     for (CSVRecord record : records) 
     { 
      String lastName = record.get("last_name"); 
      String firstName = record.get("first_name"); 

      System.out.println("firstName: " + firstName + " lastName: " + lastName); 
     } 
    } 

} 

Il contenuto del CSV:

first_name,last_name,address1,city,state,zip,country,phone,email 
Robin,Lee,668 Kinsman Road,Hagerstown,TX,94913,United States,5-(078)623-0713,[email protected] 
Bobby,Moreno,68 Dorton Avenue,Reno,AZ,79934,United States,5-(080)410-6743,[email protected] 
Eugene,Alexander,3 Bunker Hill Court,Newark,MS,30066,United States,5-(822)147-6867,[email protected] 
Katherine,Crawford,3557 Caliangt Avenue,New Orleans,OR,23289,United States,2-(686)178-7222,[email protected] 

Si trova nella mia cartella src.

risposta

69

Calling withHeader() per il formato predefinito di Excel CSV ha lavorato per me:

CSVFormat.EXCEL.withHeader().parse(in); 

Il campione nella documentazione non è molto chiaro, ma è possibile trovato here : colonne che fanno riferimento in modo sicuro: Se la fonte contiene un record di intestazione, è possibile semplificare il codice e fare riferimento alle colonne in modo sicuro, utilizzando withHeader (String ...) senza argomenti: CSVFormat.EXCEL.withHeader();

+6

L'esempio di guida utente csv è semplicemente sbagliato. A proposito di par per il corso per progetti open source. https://commons.apache.org/proper/commons-csv/user-guide.html – Michael

Problemi correlati