[使用Java opencsv读取时如何跳过csv标头中的其他(,)逗号

问题描述 投票:-1回答:1

我正在使用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,

的原因

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

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

java opencsv
1个回答
0
投票

当前找到了解决该问题的快速解决方案,但不是完整的解决方案。当我们写入csv文件时,我在(\ n)结束行之前的行末添加了额外的delimiter(;)。

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也能够正确映射标题。

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

© www.soinside.com 2019 - 2024. All rights reserved.