如何在使用 Java OpenCSV 阅读时跳过 CSV 标头中的其他 (,) 逗号



我正在使用OpenCSV 4.6来读写csv文件。我有一个像爪哇豆

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.可见性,最后一个标头值具有其他字符,这就是为什么它无法将标头名称从可见性映射到可见性的原因,

注意:输入文件中的逗号(,(存在问题。我无法限制用户上传值中带有逗号的文件。

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新