Uploaded image for project: 'Commons CSV'
  1. Commons CSV
  2. CSV-65

Header support

    XMLWordPrintableJSON

Details

    • New Feature
    • Status: Closed
    • Major
    • Resolution: Fixed
    • None
    • 1.0
    • Parser
    • None

    Description

      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:

      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);
      }
      

      The header should be defined in the format with something like this:

      CSVFormat format = CSVFormat.DEFAULT.withHeader();
      

      Then either the parser provides the column name to index mapping automatically:

      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);
      } 
      

      or the parser returns a Map like structure similar to a JDBC ResultSet (replacing String[]):

      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);
      } 
      

      Attachments

        1. CSVRecord.java
          2 kB
          Emmanuel Bourg
        2. CSVParser.java
          9 kB
          Emmanuel Bourg
        3. CSVFormat.java
          18 kB
          Emmanuel Bourg

        Issue Links

          Activity

            People

              Unassigned Unassigned
              ebourg Emmanuel Bourg
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: