有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在使用java opencsv阅读时跳过csv标题中的其他(,)逗号

我使用OpenCSV4.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标题时出错因为当我们尝试映射标题时,它将基于分隔符(;)进行拆分然后值将为1。项目代码2。项目名称和3可见性,最后一个标题值包含其他字符,这就是为什么它无法将标题名称从可见性映射到可见性,

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

在映射头时有没有办法解决这个问题


共 (1) 个答案

  1. # 1 楼答案

    目前已找到一些快速解决方案,但尚未找到问题的完整解决方案。当我们写入csv文件时,我添加了额外的分隔符(;)在(\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. 项目代码2。项目名称3。能见度和4。“,即使我们现在得到了额外的标题HeaderColumnNameMappingStrategy能够正确地映射标题

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