Take the 2-minute tour ×

Also, allows handling of long rows in a readable/easy manner, in writing them as well as in reading them.

I've looked into opencsv but it does not refer to elements in row in any sequential fashion, and supercsv does not allow looking into column by name but number only.

Another caveat - for which I need to be able to address columns by name - is that the number of columns is not constant, and only part of the column headers are constant, something like:


where not all colors between 1 and 67 are present in any given CSV file.

share|improve this question
Does this similar question stackoverflow.com/questions/200609/… help? –  andyb Jul 18 '11 at 14:42
not exactly, as I've already found it and read the answers, but trying again now... –  akapulko2020 Jul 18 '11 at 14:50
add comment

2 Answers

up vote 4 down vote accepted

I can't really speak to opencsv, but if you have a fixed number of fields you might be able to use the JavaBean binding to do something like this.

Super CSV however, definitely supports reading and writing CSV rows by name using CsvBeanReader, CsvDozerBeanReader or CsvMapReader (and their writing equivalents).

If you prefer to keep things simple and use a map (with the column name as key, and the column value as the value) then you could use CsvMapReader. There are examples on reading and writing with CsvMapReader on the Super CSV website.

A reading example:

 ICsvMapReader mapReader = new CsvMapReader(
      new FileReader("foo.csv"), CsvPreference.EXCEL_PREFERENCE);
 try {
  final String[] headers = mapReader.getHeader(true);
  Map<String, String> row;
  while( (row = mapReader.read(headers)) != null) {
    for (String header : headers) {
      System.out.println(header + " is " + row.get(header));
} finally {

Writing is quite similar.

share|improve this answer
Nope, number of fields is not fixed.. –  akapulko2020 Jul 19 '11 at 6:01
@akapulko: That's not an issue with the CsvMapReader, which can handle an arbitrary number and arrangement of columns. –  ig0774 Jul 19 '11 at 11:37
thanks for the code sample and the links, going to deep-dive into them :) –  akapulko2020 Jul 20 '11 at 8:07
i know this is old, but inFile in this example should be mapReader and row.get("header") should be row.get(header) - thanks anyways for this example :) –  steve Mar 3 '12 at 19:52
Updated for Super CSV 2.0.0 and fixed code for @steve –  Hound Dog Nov 13 '12 at 10:45
add comment

CsvReader has a get() method to read a column by name. The CsvWriter counterpart cannot write to a named column though, so it might only solve half your problem.

share|improve this answer
add comment

Your Answer


