使用具有多个变量列的SuperCsv

时间:2013-08-13 04:42:46

标签: csv supercsv

我在Super CSV website中查看此示例,其中显示dateofbirth是可选列。如果我有多个可选列,会发生什么?代码将如何改变?

 private static void readVariableColumnsWithCsvListReader() throws Exception {

        final CellProcessor[] allProcessors = new CellProcessor[] { new UniqueHashCode(), // customerNo (must be unique)
                new NotNull(), // firstName
                new NotNull(), // lastName
                new ParseDate("dd/MM/yyyy") }; // birthDate

        final CellProcessor[] noBirthDateProcessors = new CellProcessor[] { allProcessors[0], // customerNo
                allProcessors[1], // firstName
                allProcessors[2] }; // lastName

        ICsvListReader listReader = null;
        try {
                listReader = new CsvListReader(new FileReader(VARIABLE_CSV_FILENAME), CsvPreference.STANDARD_PREFERENCE);

                listReader.getHeader(true); // skip the header (can't be used with CsvListReader)

                while( (listReader.read()) != null ) {

                        // use different processors depending on the number of columns
                        final CellProcessor[] processors;
                        if( listReader.length() == noBirthDateProcessors.length ) {
                                processors = noBirthDateProcessors;
                        } else {
                                processors = allProcessors;
                        }

                        final List<Object> customerList = listReader.executeProcessors(processors);
                        System.out.println(String.format("lineNo=%s, rowNo=%s, columns=%s, customerList=%s",
                                listReader.getLineNumber(), listReader.getRowNumber(), customerList.size(), customerList));
                }

        }
        finally {
                if( listReader != null ) {
                        listReader.close();
                }
        }
}

如果可选列不在末尾但在中心或其他地方呢?

1 个答案:

答案 0 :(得分:2)

因此,真正的问题是要应用正确的单元处理器,您需要知道每列中的数据。使用有效的CSV文件(每行上的列数相同)这不是问题,但如果您正在处理变量列CSV文件,则很棘手。

如果像示例一样,只有1列是可选的,那么您只需要计算读取的列数并使用适当的单元格处理器数组。 where 可选列并不重要,因为它仍然是可预测的。

但是,如果超过1列是可选的,则您遇到麻烦。例如,如果以下CSV文件中middleNamecity是可选的:

firstName,middleName,lastName,city
Philip,Fry,New York

可以理解为:

firstName="Philip", middleName="Fry", lastName="New York", city=null

firstName="Philip", middleName=null, lastName="Fry", city="New York"

它已不再可预测。您可以检查列中的数据以确定该列应该表示的内容(例如,日期具有/),但这不是很强大,即便如此,您甚至可能需要阅读几行为了弄明白。