You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Max van den Aker (JIRA)" <ji...@apache.org> on 2017/12/07 15:27:00 UTC

[jira] [Created] (CSV-218) CSVParser's iterator's hasNext throws IOException

Max van den Aker created CSV-218:
------------------------------------

             Summary: CSVParser's iterator's hasNext throws IOException
                 Key: CSV-218
                 URL: https://issues.apache.org/jira/browse/CSV-218
             Project: Commons CSV
          Issue Type: Bug
          Components: Parser
    Affects Versions: 1.5
            Reporter: Max van den Aker
            Priority: Minor
             Fix For: Patch Needed, Discussion


Method hasNext() of the CSVParser iterator throws an IOException if the next entry in the CSV file contains a malformed record. IMHO, it's preferable that hasNext() merely indicates whether or not a next entry is available. (Method next() will then throw the exception if the record is malformed. This way it's easier to continue parsing after encountering a malformed record.)

{code:java}
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;

public class CSVFileReader {
    private static final String [] FILE_HEADER_MAPPING = {"id","firstName","lastName","gender","age"};
    private static final String STUDENT_ID = "id";
    private static final String STUDENT_FNAME = "firstName";
    
    public static void read(String fileName) {
        FileReader fileReader = null;
        CSVParser csvFileParser = null;
        
        CSVFormat csvFileFormat = CSVFormat.RFC4180.
                withDelimiter(',').
                withQuote('"').
                withRecordSeparator("\r\n").
                withIgnoreEmptyLines(true).
                withAllowMissingColumnNames(false).
                withFirstRecordAsHeader();

        try {
            fileReader = new FileReader(fileName);
            csvFileParser = csvFileFormat.parse(fileReader);
        } catch (Exception e) { 
            e.printStackTrace();
        }

        Iterator<CSVRecord> iter = csvFileParser.iterator();

        try {
            while(iter.hasNext()) {
                try {
                    CSVRecord record = iter.next();
                    System.out.println(record.get(STUDENT_ID) + " " + record.get(STUDENT_FNAME));
                } catch (Exception e) {
                    //e.printStackTrace();
                }
            }
        } catch (Exception e) {
            System.out.println("iter.hasNext() exception");
        }

        try {
            fileReader.close();
            csvFileParser.close();
        } catch (Exception e) {
            //e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        CSVFileReader.read("./malformed.csv");
    }

}
{code}

CSV sample, with entry no. 3 malformed (malformed.csv):

id,firstName
1,"Ahmed"
2,"Sara"
3,"Ali
4,"Sama"
5,"Khaled"
6,"Ghada"




--
This message was sent by Atlassian JIRA
(v6.4.14#64029)