首页 > 解决方案 > 如何在使用 java opencsv 阅读时跳过 csv 标头中的附加 (,) 逗号

问题描述

我正在使用 OpenCSV 4.6 来读取和写入 csv 文件。我有一个类似的java bean

   public class CMMProjectInfo implements Serializable {

        private static final long serialVersionUID = 1L;

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

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

       @CsvBindByName(column = "Visibility",required = true)
       private String visibility;
  }

如果用户上传有效的 csv 文件,如下所示

ProjectCode;ProjectName;Visibility
T1;Test, 1;1
T2;Test2;0
TST;Test3;1

我们可以使用HeaderColumnNameMappingStrategy将标题映射到对象。如果用户使用 excel 编辑器编辑 csv 文件,则文件将如下更改(它附加了额外的字符(

ProjectCode;ProjectName;Visibility,
T1;Test,1;1
T2;Test2;0,
TST;Test3;1,

现在,如果用户上传了由 excel 文件编辑的文件,则无法映射标题并出现错误 捕获 CSV 标题时出错!因为当我们尝试映射标头时,它将基于 delimiter(;) 进行拆分,然后值将是 1. ProjectCode 2. ProjectName 和 3. Visibility,最后一个标头值具有其他字符,这就是它无法将标头名称从Visibility映射到Visibility的原因,

注意:这里输入文件中的逗号(,)有问题。我不能限制用户上传值中有逗号的文件。

映射标头时有什么方法可以解决此问题?

标签: javaopencsv

解决方案


目前找到了一些快速解决方案,但不是完整的问题解决方案。当我们写入 csv 文件时,我在行的末尾添加了额外的分隔符 (;) before(\n) 结束行。

StatefulBeanToCsv beanWriter = builder
                        .withApplyQuotesToAll(false)
                        .withSeparator(';')
                        .withMappingStrategy(new AnnotationStrategy(this.inputData.iterator().next().getClass()))
                        .withLineEnd(";\n")
                        .build();

从 withLineEnd("\n") 更改为 withLineEnd(";\n")。这将在行尾添加额外的分隔符。下载该文件后,如下所示

ProjectCode;ProjectName;Visibility;
T1;Test, 1;1;
T2;Test2;0;
TST;Test3;1;

如果我们使用 excel 编辑器编辑文件,则附加字符将附加在行尾而不是现有标题上。例如在编辑文件后它显示如下

ProjectCode;ProjectName;Visibility;,
T1;Test,1;1;
T2;Test2;0;,
TST;Test3;1;,

当我们映射到标题时,它会拆分标题行,如下所示

  1. ProjectCode 2. ProjectName 3.Visibility 和 4.",即使我们现在获得了额外的标题HeaderColumnNameMappingStrategy能够正确映射标题。

我知道这不是完整的解决方案。如果您还有其他想法,请分享


推荐阅读