Использование CsvBeanReader для чтения файла CSV с переменным количеством столбцов

Поэтому я работаю над анализом файла .csv. Я воспользовался советом другой ветки где-то на StackOverflow и скачал SuperCSV. Наконец-то у меня все заработало, но теперь я столкнулся с ошибкой, которую трудно исправить.

Проблема возникает из-за того, что последние два столбца данных могут быть заполнены или не заполнены. Вот пример файла .csv с первой строкой, в которой отсутствует последний столбец, а второй строкой полностью завершен:

2012:07:25,11:48:20,922,"uLog.exe","",Key pressed,1246,341,-1.00,-1.00,1.00,Shift 2012:07:25,11:48:21,094,"uLog.exe","",Key pressed,1246,341,-1.00,-1.00,1.00,b,Shift

Из моего пониманияСупер CSV Javadocнет способа заполнить Java-бинCsvBeanReader если есть переменное количество столбцов. Это кажется очень глупым, потому что я чувствую, что эти пропущенные столбцы должны иметь нулевое значение или какое-либо другое значение по умолчанию при инициализации Бина.

Для справки вот мой полный код парсера:

public class ULogParser {

String uLogFileLocation;
String screenRecorderFileLocation;

private static final CellProcessor[] cellProcessor = new CellProcessor[] {
    new ParseDate("yyyy:MM:dd"),
    new ParseDate("HH:mm:ss"),
    new ParseDate("SSS"),
    new StrMinMax(0, 100),
    new StrMinMax(0, 100),
    new StrMinMax(0, 100),
    new ParseInt(),
    new ParseInt(),
    new ParseDouble(),
    new ParseDouble(),
    new ParseDouble(),
    new StrMinMax(0, 100),
    new StrMinMax(0, 100),
};

public String[] header = {"Date", "Time", "Msec", "Application", "Window", "Message", "X", "Y", "RelDist", "TotalDist", "Rate", "Extra1", "Extra2"}; 

public ULogParser(String uLogFileLocation, String screenRecorderFileLocation)
{
    this.uLogFileLocation = uLogFileLocation;
    this.screenRecorderFileLocation = screenRecorderFileLocation;
}

public void parse()
{
    try {
        ICsvBeanReader reader = new CsvBeanReader(new BufferedReader(new FileReader(uLogFileLocation)), CsvPreference.STANDARD_PREFERENCE);
        reader.getCSVHeader(false); //parse past the header
        Entry entry;
        entry = reader.read(Entry.class, header, cellProcessor);
        System.out.println(entry.Application);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public void sendToDB()
{
    Query query = new Query();
}
}

И код для класса Entry:

public class Entry
{
private Date Date;
private Date Time;
private Date Msec;
private String Application;
private String Window;
private String Message;
private int X;
private int Y;
private double RelDist;
private double TotalDist;
private double Rate;
private String Extra1;
private String Extra2;

public Date getDate() { return Date; }
public Date getTime() { return Time; }
public Date getMsec() { return Msec; }
public String getApplication() { return Application; }
public String getWindow() { return Window; }
public String getMessage() { return Message; }
public int getX() { return X; }
public int getY() { return Y; }
public double getRelDist() { return RelDist; }
public double getTotalDist() { return TotalDist; }
public double getRate() { return Rate; }
public String getExtra1() { return Extra1; }
public String getExtra2() { return Extra2; }

public void setDate(Date Date) { this.Date = Date; }
public void setTime(Date Time) { this.Time = Time; }
public void setMsec(Date Msec) { this.Msec = Msec; }
public void setApplication(String Application) { this.Application = Application; }
public void setWindow(String Window) { this.Window = Window; }
public void setMessage(String Message) { this.Message = Message; }
public void setX(int X) { this.X = X; }
public void setY(int Y) { this.Y = Y; }
public void setRelDist(double RelDist) { this.RelDist = RelDist; }
public void setTotalDist(double TotalDist) { this.TotalDist = TotalDist; }
public void setRate(double Rate) { this.Rate = Rate; }
public void setExtra1(String Extra1) { this.Extra1 = Extra1; }
public void setExtra2(String Extra2) { this.Extra2 = Extra2; }

public Entry(){}
}

И исключение, которое я получаю (обратите внимание, что эта строка отличается от моего приведенного выше примера, пропуская оба из последних двух столбцов):

Exception in thread "main" The value array (size 12)  must match the processors array (size 13): You are probably reading a CSV line with a different number of columns than the number of cellprocessors specified context: Line: 2 Column: 0 Raw line:
[2012:07:25, 11:48:05, 740, uLog.exe,  , Logging started, -1, -1, -1.00, -1.00, -1.00, ]
 offending processor: null
    at org.supercsv.util.Util.processStringList(Unknown Source)
    at org.supercsv.io.CsvBeanReader.read(Unknown Source)
    at processing.ULogParser.parse(ULogParser.java:59)
    at ui.ParseImplicitData.main(ParseImplicitData.java:15)

Да, писать все эти добытчики и сеттеры было больно в задницу. Кроме того, я прошу прощения, у меня, вероятно, нет идеального соглашения в моем использовании SuperCSV (например, какой CellProcessor использовать, если вы просто хотите неизмененную строку), но вы поняли идею. Кроме того, этот код явно не завершен. На данный момент я просто пытаюсь успешно извлечь строку данных.

На данный момент мне интересно, возможно ли использование CsvBeanReader для моих целей. Если нет, то я немного разочарован, поскольку CsvListReader (я бы опубликовал гиперссылку, но StackOverflow и мне тоже не позволяет, тоже тупой) почти так же просто, как вообще не использовать API и просто использовать Scanner.next ( ).

Любая помощь будет оценена. Заранее спасибо!

Ответы на вопрос(3)

Ваш ответ на вопрос