You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2012/09/12 15:41:07 UTC

svn commit: r1383934 - in /commons/proper/csv/trunk/src: main/java/org/apache/commons/csv/CSVParser.java test/java/org/apache/commons/csv/CSVParserTest.java

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