首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多变量列的SuperCsv

使用多变量列的SuperCsv
EN

Stack Overflow用户
提问于 2013-08-13 04:42:45
回答 1查看 1.5K关注 0票数 3

我看了来自Super 网站的这个例子,它显示出生日期是可选列。如果我有多个可选列,会发生什么情况?代码会发生什么变化?

代码语言:javascript
复制
 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();
                }
        }
}

另外,如果可选列不是在末尾,而是在中间或其他地方呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-14 23:01:27

所以这里真正的问题是,要应用正确的单元处理器,您需要知道每一列中有什么数据。有一个有效的CSV文件(相同的编号)。)这不是一个问题,但如果您处理的是一个可变列CSV文件,这是一个棘手的问题。

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

但是,如果超过1列是可选的,那么您就有麻烦了。例如,如果middleNamecity在以下CSV文件中是可选的:

代码语言:javascript
复制
firstName,middleName,lastName,city
Philip,Fry,New York

可理解为:

代码语言:javascript
复制
firstName="Philip", middleName="Fry", lastName="New York", city=null

代码语言:javascript
复制
firstName="Philip", middleName=null, lastName="Fry", city="New York"

它不再是可预测的。您可能可以检查列中的数据,以确定该列应该代表什么(例如,日期具有/'s),但这并不是非常可靠,即使这样,您也可能需要阅读几行才能弄清楚。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18200826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档