commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sebb (Commented) (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CSV-65) Header support
Date Thu, 15 Mar 2012 12:19:37 GMT

    [ 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

        

Mime
View raw message