[ 
https://issues.apache.org/jira/browse/CSV-65?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13230103#comment-13230103
 ] 

Sebb commented on CSV-65:
-------------------------

I think the header should be initialised in the CSVParser ctor (failing that, 
could perhaps use an IODH idiom).
As it stands, getRecord() calls format.getHeader() every time if that returns 
null.

Also, I'm not sure why CSVRecord should ever have a null values array - surely 
a zero-length array would be easier to use?

Also, the mapping applies to all records, so I don't think it belongs in the 
record.
                
> Header support
> --------------
>
>                 Key: CSV-65
>                 URL: https://issues.apache.org/jira/browse/CSV-65
>             Project: Commons CSV
>          Issue Type: New Feature
>          Components: Parser
>            Reporter: Emmanuel Bourg
>             Fix For: 1.0
>
>         Attachments: CSVFormat.java, CSVParser.java, CSVRecord.java
>
>
> Commons CSV is missing some elements to help dealing with CSV file headers.
> With the current API one has to write the following code to read the fields 
> by name:
> {code:java}
> CSVParser parser = new CSVParser(in);
> Iterator<String[]> it = parser.iterator();
> // read the header
> String[] header = it.next();
> // build a name to index mapping
> Map<String, Integer> mapping = new HashMap<>();
> for (int i = 0; i < header.length; i++) {
>     mapping.put(header[i], i);
> }
> // parse the records
> for (String[] record : parser) {
>     Person person = new Person();
>     person.setName(record[mapping.get("name")]);
>     person.setEmail(record[mapping.get("email")]);
>     person.setPhone(record[mapping.get("phone")]);
>     persons.add(person);
> }
> {code}
> The header should be defined in the format with something like this:
> {code:java}
> CSVFormat format = CSVFormat.DEFAULT.withHeader();
> {code}
> Then either the parser provides the column name to index mapping 
> automatically:
> {code:java}
> CSVFormat format = CSVFormat.DEFAULT.withHeader();
> CSVParser parser = new CSVParser(in, format);
> // parse the records
> for (String[] record : parser) {
>     Person person = new Person();
>     person.setName(record[parser.indexOf("name")]);
>     person.setEmail(record[parser.indexOf("email")]);
>     person.setPhone(record[parser.indexOf("phone")]);
>     persons.add(person);
> } 
> {code}
> or the parser returns a Map like structure similar to a JDBC ResultSet 
> (replacing String[]):
> {code:java}
> CSVFormat format = CSVFormat.DEFAULT.withHeader();
> for (CSVRecord record : format.parse(in)) {
>     Person person = new Person();
>     person.setName(record.get("name"));
>     person.setEmail(record.get("email"));
>     person.setPhone(record.get("phone"));
>     persons.add(person);
> } 
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to