OPENCSV:在解析方法上捕获CSV标头的错误

发布于 2025-02-04 17:48:51 字数 5415 浏览 1 评论 0原文

我的OpenCSV版本是:5.5.2

我上传一个CSV文件,然后调用parsecsvfile方法,如下

List<CSVCouponData> csvData = CSVFileHelper.parseCSVFile(multipartFile.getInputStream());

所示是我的代码,

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,

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;

当我调试代码时,它会在此行中丢弃和错误= csvtobean.parse(); 。

java.lang.RuntimeException: Error capturing CSV header!

即使我已经提供了所有标记的字段,这些字段在我的csvcoupondata中= true,但我

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在分析上捕获CSV标题 请提出任何建议

My OpenCSV Version is : 5.5.2

I upload a CSV file and call the parseCSVFile method like this

List<CSVCouponData> csvData = CSVFileHelper.parseCSVFile(multipartFile.getInputStream());

Following is my code

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;
    }

The following is my CSVCouponData

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;

When i debug my code it throws and error at this line rec = csvToBean.parse(); with this error

java.lang.RuntimeException: Error capturing CSV header!

Even though i have provided all the fields which are marked required =true in my CsvCouponData, i see this error

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].

Initially i had opencsv version 4.4 and did not have this error.

But when i upgraded the version to 5.5.2 i started seeing this error. I have also upgraded to the latest version which is 5.6, but still no luck.

I have gone through this link which is almost similar to the error i get, but no solutions have helped

OpenCSV throws Error capturing CSV header on parse
Any suggestions please

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

迷离° 2025-02-11 17:48:51

我已经弄清楚了这个问题。问题不是代码,但问题是文件格式。我们要上传的CSV文件使用以下格式保存。CSV(UTF-8)。然后将文件格式更改为.csv解决了问题。

I have figured out the issue. The problem is not with the code, but the problem was the file format. The csv file which we were uploading was saved with the following format .csv(utf-8). Then changing the format of the file to .csv solved the issue.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文