首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ParseEnum (方法)不能从.csv文件( SuperCSV )中解析/读取字符串

ParseEnum (方法)不能从.csv文件( SuperCSV )中解析/读取字符串
EN

Stack Overflow用户
提问于 2016-08-14 23:48:12
回答 1查看 2.8K关注 0票数 1

这个周末,我尝试了你的伟大框架,并希望在生产中使用它。不幸的是,我的Employee Bean有一个属性sexuality,它的类型是enum。由于某种原因,集成的官方ParseEnum单元处理器无法在读取.csv文件时解析性属性。你能查一下这个吗?

错误消息

代码语言:javascript
复制
Exception in thread "main" org.supercsv.exception.SuperCsvCellProcessorException: ' BI' could not be parsed as a enum of type test.supercsv.Sexuality
processor=org.supercsv.cellprocessor.ParseEnum
context={lineNo=2, rowNo=2, columnNo=5, rowSource=[1, Pankaj Kumar, CEO, 5,000USD,  BI]}
    at org.supercsv.cellprocessor.ParseEnum.execute(ParseEnum.java:146)
    at org.supercsv.util.Util.executeCellProcessors(Util.java:93)
    at org.supercsv.io.AbstractCsvReader.executeProcessors(AbstractCsvReader.java:203)
    at org.supercsv.io.CsvBeanReader.readIntoBean(CsvBeanReader.java:261)
    at org.supercsv.io.CsvBeanReader.read(CsvBeanReader.java:190)
    at test.supercsv.Reading.readWithCsvBeanReader(Reading.java:35)
    at test.supercsv.Reading.main(Reading.java:24)

部分码

枚举CellProcessor

代码语言:javascript
复制
 private static CellProcessor[] getProcessors() {

        final CellProcessor[] processors = new CellProcessor[]{
            new UniqueHashCode(), // ID (must be unique)
            new NotNull(), // Name
            new Optional(), // Role
            new NotNull(), // Salary
            new ParseEnum(Sexuality.class, true) // enum Sexuality
        };

        return processors;
    }

csv文件中的第一个Employee对象

代码语言:javascript
复制
1,Pankaj Kumar,CEO,"5,000USD", BI

全码

员工豆

代码语言:javascript
复制
package test.supercsv;

public class Employee {

    private String id;
    private String name;
    private String role;
    private String salary;
    private Sexuality sexuality;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public String getSalary() {
        return salary;
    }

    public void setSalary(String salary) {
        this.salary = salary;
    }

    public Sexuality getSexuality() {
        return sexuality;
    }

    public void setSexuality(Sexuality sexuality) {
        this.sexuality = sexuality;
    }

    @Override
    public String toString() {
        return "Employee{" + "id=" + id + ", name=" + name + ", role=" + role + ", salary=" + salary
                + ", sexuality=" + sexuality.name()
                + '}';
    }

}

[医]性行为

代码语言:javascript
复制
package test.supercsv;

public enum Sexuality {

    HETERO, HOMO, BI, TRANSGENDER;

}

CSVBeanReader

代码语言:javascript
复制
package test.supercsv;

import java.io.FileReader;
import java.io.IOException;
import org.supercsv.cellprocessor.Optional;
import org.supercsv.cellprocessor.ParseEnum;
import org.supercsv.cellprocessor.constraint.NotNull;
import org.supercsv.cellprocessor.constraint.UniqueHashCode;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.io.CsvBeanReader;
import org.supercsv.io.ICsvBeanReader;
import org.supercsv.prefs.CsvPreference;

public class Reading {

    private static final String CSV_FILENAME = "src/resources/employee.csv";

    public static void main(String[] args) throws IOException {
        readWithCsvBeanReader();
    }

    private static void readWithCsvBeanReader() throws IOException {
        try (ICsvBeanReader beanReader = new CsvBeanReader(new FileReader(CSV_FILENAME), CsvPreference.STANDARD_PREFERENCE)) {

            // the header elements are used to map the values to the bean (names must match)
            final String[] header = beanReader.getHeader(true);
            final CellProcessor[] processors = getProcessors();

            Employee employee;
            while ((employee = beanReader.read(Employee.class, header, processors)) != null) {
                System.out.println(String.format("lineNo=%s, rowNo=%s, employee=%s",
                        beanReader.getLineNumber(),
                        beanReader.getRowNumber(),
                        employee));
            }

        }
    }

    private static CellProcessor[] getProcessors() {

        final CellProcessor[] processors = new CellProcessor[]{
            new UniqueHashCode(), // ID (must be unique)
            new NotNull(), // Name
            new Optional(), // Role
            new NotNull(), // Salary
            new ParseEnum(Sexuality.class, true) // enum Sexuality
        };

        return processors;
    }
}

CSV-文件内容

代码语言:javascript
复制
ID,Name,Role,Salary,Sexuality
1,Pankaj Kumar,CEO,"5,000USD", BI
2,Lisa,Manager,500USD, Homo
3,David,,1000USD, Hetero
EN

回答 1

Stack Overflow用户

发布于 2016-08-15 12:02:00

解决方案

正如Hound Dog所指出的:我的csv文件中的spaces是造成麻烦的原因。只要擦除它们,代码就能工作了!

代码语言:javascript
复制
ID,Name,Role,Salary,Sexuality
1,Pankaj Kumar,CEO,"5,000USD,BI
2,Lisa,Manager,500USD,Homo
3,David,,1000USD,Hetero
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38947629

复制
相关文章

相似问题

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