发布
社区首页 >问答首页 >OpenCSV :在解析方法上抛出捕获csv标头的错误

OpenCSV :在解析方法上抛出捕获csv标头的错误
EN

Stack Overflow用户
提问于 2022-06-03 13:33:15
回答 1查看 575关注 0票数 0

我的OpenCSV版本是: 5.5.2

我上传一个CSV文件并调用parseCSVFile方法,如下所示

代码语言:javascript
代码运行次数:0
复制
List<CSVCouponData> csvData = CSVFileHelper.parseCSVFile(multipartFile.getInputStream());

以下是我的代码

代码语言:javascript
代码运行次数:0
复制
public static List<CSVCouponData> parseCSVFile(InputStream inputStream) throws IOException {
        CSVReader reader = null;
        List<CSVCouponData> rec = null;
        try {
           reader = new CSVReader(new InputStreamReader(inputStream));

           HeaderColumnNameMappingStrategy<CSVCouponData> beanStrategy = new HeaderColumnNameMappingStrategy<>();
           beanStrategy.setType(CSVCouponData.class);

           CsvToBean<CSVCouponData> csvToBean = new CsvToBean<>();
           csvToBean.setCsvReader(reader);
           csvToBean.setMappingStrategy(beanStrategy);
           csvToBean.setIgnoreEmptyLines(true);
           rec = csvToBean.parse();
       } finally {
            if(reader != null)
                reader.close();
       }

        return rec;
    }

以下是我的CSVCouponData

代码语言:javascript
代码运行次数:0
复制
public class CSVCouponData {

    @CsvBindByName(column = "name", required = true)
    private String name;

    @CsvBindByName(column = "coupon-type", required = true)
    private String couponType;

    @CsvBindByName(column = "incentive-program-id", required = true)
    private String programId;

    @CsvBindByName(column = "coupons-amount")
    private Long couponsAmount;

    @CsvBindByName(column = "coupon-benefits.unit-of-measure")
    private String unitOfMeasure;

    @CsvBindByName(column = "coupon-benefits.benefit-target-party")
    private String benefitTargetParty;

    @CsvBindByName(column = "coupon-benefits.characteristics")
    private String characteristics;

    @CsvBindByName(column = "coupon-benefits.benefit-type")
    private String benefitType;

    @CsvBindByName(column = "coupon-benefits.benefit-confirmation-source")
    private String benefitConfirmationSource;

    @CsvBindByName(column = "coupon-benefits.benefit-currency")
    private String benefitCurrency;

    @CsvBindByName(column = "coupon-benefits.benefit-amount")
    private String benefitAmount;

    @CsvBindByName(column = "coupon-benefits.benefit-description", required = true)
    private String benefitDescription;

    @CsvBindByName(column = "benefit-catalog-info.product-offering-ids")
    private String productOfferingIds;

    @CsvBindByName(column = "benefit-catalog-info.discount-id")
    private String discountId;

    @CsvBindByName(column = "benefit-catalog-info.cardinality.min")
    private Integer cardinalityMin;

    @CsvBindByName(column = "benefit-catalog-info.cardinality.max")
    private Integer cardinalityMax;

    @CsvBindByName(column = "external-id", required = true)
    private String externalId;

    @CsvBindByName(column = "valid_from", required = true)
    private String validFrom;

    @CsvBindByName(column = "valid_to", required = true)
    private String validTo;

    @CsvBindByName(column = "sales_context.batch-id")
    private String batchId;

    @CsvBindByName(column = "sales_context.campaign-id")
    private String campaignId;

    @CsvBindByName(column = "sales_context.chain-id")
    private String chainId;

    @CsvBindByName(column = "sales_context.channel")
    private String channel;

    @CsvBindByName(column = "sales_context.dealer-id")
    private String dealerId;

    @CsvBindByName(column = "sales_context.sales-type")
    private String salesType;

    @CsvBindByName(column = "sales_context.salesperson-id")
    private String salesPersonId;

    @CsvBindByName(column = "incentive-coupon-batches.partner-name", required = true)
    private String partnerName;

    @CsvBindByName(column = "incentive-coupon-batches.redemption-specification-owner", required = true)
    private String redemptionSpecificationOwner;

    @CsvBindByName(column = "incentive-coupon-batches.distribution-specification.owner", required = true)
    private String distributionSpecificationOwner;

    @CsvBindByName(column = "incentive-coupon-batches.distribution-specification.method", required = true)
    private String distributionSpecificationMethod;

    @CsvBindByName(column = "incentive-coupons.code", required = true)
    private String code;

    @CsvBindByName(column = "brand")
    private String brand;

当我调试我的代码时,它会在以下一行抛出错误: rec = csvToBean.parse();使用此错误

代码语言:javascript
代码运行次数:0
复制
java.lang.RuntimeException: Error capturing CSV header!

即使在我的CsvCouponData中提供了所有标记为required =true的字段,但我还是看到了这个错误

代码语言:javascript
代码运行次数:0
复制
com.opencsv.exceptions.CsvRequiredFieldEmptyException: Header is missing required fields [INCENTIVE-PROGRAM-ID]. The list of headers encountered is [ incentive-program-id,coupon-type,name,coupon-benefits.benefit-description,external-id,valid_from,valid_to,incentive-coupon-batches.partner-name,incentive-coupon-batches.redemption-specification-owner,incentive-coupon-batches.distribution-specification.owner,incentive-coupon-batches.distribution-specification.method,incentive-coupons.code].

最初,我使用了opencsv版本4.4,并且没有这个错误。

但是当我将版本升级到5.5.2时,我开始看到这个错误。我也升级到了最新版本的5.6,但仍然没有运气。

我已经通过了这个链接,这与我所得到的错误几乎相似,但是没有任何解决方案能帮助我。

OpenCSV throws Error capturing CSV header on parse请提出任何建议

EN

回答 1

Stack Overflow用户

发布于 2022-06-08 06:31:34

我已经解决了这个问题。问题不在于代码,而是文件格式。我们上传的csv文件是用以下格式.csv(utf-8)保存的。然后将文件格式更改为.csv解决了这个问题。

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

https://stackoverflow.com/questions/72490416

复制
相关文章

相似问题

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