Author: sebb
Date: Thu Mar 29 16:03:03 2012
New Revision: 1306947

URL: http://svn.apache.org/viewvc?rev=1306947&view=rev
Log:
CSV-85 Allow comments to be returned in CSVRecord

Modified:
    commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVLexer.java
    commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVParser.java
    commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVRecord.java
    
commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVFileParserTest.java
    
commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVLexerTest.java

Modified: 
commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVLexer.java
URL: 
http://svn.apache.org/viewvc/commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVLexer.java?rev=1306947&r1=1306946&r2=1306947&view=diff
==============================================================================
--- commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVLexer.java 
(original)
+++ commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVLexer.java 
Thu Mar 29 16:03:03 2012
@@ -77,7 +77,8 @@ class CSVLexer extends Lexer {
         }
 
         if (isStartOfLine(lastChar) && isCommentStart(c)) {
-            in.readLine();
+            String comment = in.readLine().trim();
+            tkn.content.append(comment);
             tkn.type = COMMENT;
             return tkn;
         }

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=1306947&r1=1306946&r2=1306947&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 
Thu Mar 29 16:03:03 2012
@@ -133,8 +133,9 @@ public class CSVParser implements Iterab
      * @throws IOException on parse error or input read-failure
      */
     CSVRecord getRecord() throws IOException {
-        CSVRecord result = new CSVRecord(null, headerMapping);
+        CSVRecord result = new CSVRecord(null, headerMapping, null);
         record.clear();
+        StringBuilder sb = null;
         do {
             reusableToken.reset();
             lexer.nextToken(reusableToken);
@@ -155,13 +156,20 @@ public class CSVParser implements Iterab
                 case INVALID:
                     throw new IOException("(line " + getLineNumber() + ") 
invalid parse sequence");
                 case COMMENT: // Ignored currently
+                    if (sb == null) { // first comment for this record
+                        sb = new StringBuilder();
+                    } else {
+                        sb.append("\n");
+                    }
+                    sb.append(reusableToken.content);
                     reusableToken.type = TOKEN; // Read another token
                     break;
             }
         } while (reusableToken.type == TOKEN);
         
         if (!record.isEmpty()) {
-            result = new CSVRecord(record.toArray(new String[record.size()]), 
headerMapping);
+            result = new CSVRecord(record.toArray(new String[record.size()]), 
headerMapping, 
+                    sb == null ? null : sb.toString());
         }
         return result;
     }

Modified: 
commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVRecord.java
URL: 
http://svn.apache.org/viewvc/commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVRecord.java?rev=1306947&r1=1306946&r2=1306947&view=diff
==============================================================================
--- 
commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVRecord.java 
(original)
+++ 
commons/proper/csv/trunk/src/main/java/org/apache/commons/csv/CSVRecord.java 
Thu Mar 29 16:03:03 2012
@@ -35,9 +35,13 @@ public class CSVRecord implements Serial
     /** The column name to index mapping. */
     private final Map<String, Integer> mapping;
 
-    CSVRecord(String[] values, Map<String, Integer> mapping) {
+    /** The accumulated comments (if any) */
+    private final String comment;
+
+    CSVRecord(String[] values, Map<String, Integer> mapping, String comment) {
         this.values = values != null ? values : EMPTY_STRING_ARRAY;
         this.mapping = mapping;
+        this.comment = comment;
     }
 
     /**
@@ -74,6 +78,9 @@ public class CSVRecord implements Serial
         return values;
     }
 
+    public String getComment() {
+        return comment;
+    }
     /**
      * Returns the number of values in this record.
      */

Modified: 
commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVFileParserTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVFileParserTest.java?rev=1306947&r1=1306946&r2=1306947&view=diff
==============================================================================
--- 
commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVFileParserTest.java
 (original)
+++ 
commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVFileParserTest.java
 Thu Mar 29 16:03:03 2012
@@ -89,6 +89,7 @@ public class CSVFileParserTest {
          // first line starts with csv data file name
         BufferedReader csvFile = new BufferedReader(new FileReader(new 
File(BASE, split[0])));
         CSVFormat fmt = 
CSVFormat.PRISTINE.withDelimiter(',').withEncapsulator('"');
+        boolean checkComments = false;
         for(int i=1; i < split.length; i++) {
             final String option = split[i];
             String[] option_parts = option.split("=",2);
@@ -98,6 +99,8 @@ public class CSVFileParserTest {
                 fmt = 
fmt.withSurroundingSpacesIgnored(Boolean.parseBoolean(option_parts[1]));
             } else if ("CommentStart".equalsIgnoreCase(option_parts[0])) {
                 fmt = fmt.withCommentStart(option_parts[1].charAt(0));
+            } else if ("CheckComments".equalsIgnoreCase(option_parts[0])) {
+                checkComments = true;
             } else {
                 fail(testName+" unexpected option: "+option);
             }
@@ -108,6 +111,12 @@ public class CSVFileParserTest {
         // Now parse the file and compare against the expected results
         for(CSVRecord rec : fmt.parse(csvFile)) {
             String parsed = rec.toString();
+            if (checkComments) {
+                final String comment = rec.getComment().replace("\n", "\\n");
+                if (comment != null) {
+                    parsed += "#" + comment;
+                }
+            }
             int count = rec.size();
             assertEquals(testName, readTestData(), count+":"+parsed);
         }

Modified: 
commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVLexerTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVLexerTest.java?rev=1306947&r1=1306946&r2=1306947&view=diff
==============================================================================
--- 
commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVLexerTest.java 
(original)
+++ 
commons/proper/csv/trunk/src/test/java/org/apache/commons/csv/CSVLexerTest.java 
Thu Mar 29 16:03:03 2012
@@ -63,7 +63,7 @@ public class CSVLexerTest {
                 "a,b x,c#no-comment\n"+    // 2
                 "\n"+
                 "\n"+
-                "#foo\n"+                  // 3
+                "# foo \n"+                // 3
                 "\n"+                      // 4
                 "d,e,#no-comment\n"+       // 5
                 "\n"+
@@ -85,13 +85,13 @@ public class CSVLexerTest {
         assertTokenEquals(TOKEN, "a", parser.nextToken(new Token()));
         assertTokenEquals(TOKEN, "b x", parser.nextToken(new Token()));
         assertTokenEquals(EORECORD, "c#no-comment", parser.nextToken(new 
Token())); // 2
-        assertTokenEquals(COMMENT, "", parser.nextToken(new Token()));         
     // 3
+        assertTokenEquals(COMMENT, "foo", parser.nextToken(new Token()));      
        // 3
         // 4 empty line, ignored                                               
     // 4
         assertTokenEquals(TOKEN, "d", parser.nextToken(new Token()));
         assertTokenEquals(TOKEN, "e", parser.nextToken(new Token()));
         assertTokenEquals(EORECORD, "#no-comment", parser.nextToken(new 
Token()));  // 5
-        assertTokenEquals(COMMENT, "", parser.nextToken(new Token()));         
     // 6
-        assertTokenEquals(COMMENT, "", parser.nextToken(new Token()));         
     // 7
+        assertTokenEquals(COMMENT, "penultimate comment", parser.nextToken(new 
Token()));              // 6
+        assertTokenEquals(COMMENT, "Final comment", parser.nextToken(new 
Token()));              // 7
         assertTokenEquals(EOF, "", parser.nextToken(new Token()));
         assertTokenEquals(EOF, "", parser.nextToken(new Token()));
 
@@ -130,7 +130,7 @@ public class CSVLexerTest {
         assertTokenEquals(TOKEN, "a", parser.nextToken(new Token()));
         assertTokenEquals(TOKEN, "b x", parser.nextToken(new Token()));
         assertTokenEquals(EORECORD, "c#no-comment", parser.nextToken(new 
Token())); // 2
-        assertTokenEquals(COMMENT, "", parser.nextToken(new Token()));         
     // 3
+        assertTokenEquals(COMMENT, "foo", parser.nextToken(new Token()));      
     // 3
         assertTokenEquals(EORECORD, "", parser.nextToken(new Token()));        
     // 4
         assertTokenEquals(EORECORD, "", parser.nextToken(new Token()));        
     // 4b
         assertTokenEquals(TOKEN, "d", parser.nextToken(new Token()));
@@ -138,10 +138,10 @@ public class CSVLexerTest {
         assertTokenEquals(EORECORD, "#no-comment", parser.nextToken(new 
Token()));  // 5
         assertTokenEquals(EORECORD, "", parser.nextToken(new Token()));        
     // 5b
         assertTokenEquals(EORECORD, "", parser.nextToken(new Token()));        
     // 5c
-        assertTokenEquals(COMMENT, "", parser.nextToken(new Token()));         
     // 6
+        assertTokenEquals(COMMENT, "penultimate comment", parser.nextToken(new 
Token()));              // 6
         assertTokenEquals(EORECORD, "", parser.nextToken(new Token()));        
     // 6b
         assertTokenEquals(EORECORD, "", parser.nextToken(new Token()));        
     // 6c
-        assertTokenEquals(COMMENT, "", parser.nextToken(new Token()));         
     // 7
+        assertTokenEquals(COMMENT, "Final comment", parser.nextToken(new 
Token()));              // 7
         assertTokenEquals(EOF, "", parser.nextToken(new Token()));
         assertTokenEquals(EOF, "", parser.nextToken(new Token()));
 


Reply via email to