0

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

Avinash Reddy
  • 2,204
  • 3
  • 25
  • 44

1 Answers1

0

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.

Avinash Reddy
  • 2,204
  • 3
  • 25
  • 44