Author: ggregory Date: Wed Sep 12 13:41:06 2012 New Revision: 1383934 URL: http://svn.apache.org/viewvc?rev=1383934&view=rev Log: [CVS-92] Need a way to extract parsed headers, e.g. for use in formatting output.
Modified: commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVParser.java commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVParserTest.java Modified: commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVParser.java URL: http://svn.apache.org/viewvc/commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVParser.java?rev=1383934&r1=1383933&r2=1383934&view=diff ============================================================================== --- commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVParser.java (original) +++ commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVParser.java Wed Sep 12 13:41:06 2012 @@ -17,18 +17,19 @@ package org.apache.commons.csv; +import static org.apache.commons.csv.Token.Type.TOKEN; + import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; -import static org.apache.commons.csv.Token.Type.*; - /** * Parses CSV files according to the specified configuration. * @@ -122,6 +123,18 @@ public class CSVParser implements Iterab } /** + * Returns a copy of the header map that iterates in column order. + * <p> + * The map keys are column names. + * The map values are 0-based indices. + * + * @return a copy of the header map that iterates in column order. + */ + public Map<String, Integer> getHeaderMap() { + return new LinkedHashMap<String, Integer>(headerMap); + } + + /** * Returns the current line number in the input stream. * <p/> * ATTENTION: in case your csv has multiline-values the returned number does not correspond to the record-number @@ -206,7 +219,7 @@ public class CSVParser implements Iterab private Map<String, Integer> initializeHeader(CSVFormat format) throws IOException { Map<String, Integer> hdrMap = null; if (format.getHeader() != null) { - hdrMap = new HashMap<String, Integer>(); + hdrMap = new LinkedHashMap<String, Integer>(); String[] header = null; if (format.getHeader().length == 0) { Modified: commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVParserTest.java URL: http://svn.apache.org/viewvc/commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVParserTest.java?rev=1383934&r1=1383933&r2=1383934&view=diff ============================================================================== --- commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVParserTest.java (original) +++ commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVParserTest.java Wed Sep 12 13:41:06 2012 @@ -23,8 +23,11 @@ import java.io.StringReader; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.NoSuchElementException; +import junit.framework.Assert; + import org.junit.Ignore; import org.junit.Test; @@ -502,6 +505,28 @@ public class CSVParserTest { assertFalse(records.hasNext()); } + public void testGetHeaderMap() throws Exception { + final CSVParser parser = new CSVParser("a,b,c\n1,2,3\nx,y,z", CSVFormat.DEFAULT.withHeader("A", "B", "C")); + final Map<String, Integer> headerMap = parser.getHeaderMap(); + final Iterator<String> columnNames = headerMap.keySet().iterator(); + // Headers are iterated in column order. + Assert.assertEquals("A", columnNames.next()); + Assert.assertEquals("B", columnNames.next()); + Assert.assertEquals("C", columnNames.next()); + Iterator<CSVRecord> records = parser.iterator(); + + // Parse to make sure getHeaderMap did not have a side-effect. + for (int i = 0; i < 3; i++) { + assertTrue(records.hasNext()); + CSVRecord record = records.next(); + assertEquals(record.get(0), record.get("A")); + assertEquals(record.get(1), record.get("B")); + assertEquals(record.get(2), record.get("C")); + } + + assertFalse(records.hasNext()); + } + @Test public void testGetLineNumberWithLF() throws Exception { CSVParser parser = new CSVParser("a\nb\nc", CSVFormat.DEFAULT.withLineSeparator("\n"));