java - 如何使用自定义拆分器拆分由分隔符分隔的 csv 列?

标签 java spring-mvc opencsv

我有一个休息 Controller ,它有一个后映射,应该接受 csv/文本作为输入。以下是 csv 的格式:-

id, name, phoneNumber
n1,Joe/Dowwel,123-212-3233
n2,Sara/Ali,132,232,3111

我正在使用如下所示的开放 csv 注释将 csv 转换为 java pojo 作为后映射 Controller 方法的输入。:-

@CsvBindByPosition(position=2)
private String name;

此注释会将 csv 输入字段“name”映射到 java 对象(PO​​JO)字段“name”(如下所示)

public class Employee {


    @CsvBindByPosition(position=1)
    private String id;

    @CsvBindByPosition(position=2)
    private String name;

    @CsvBindByPosition(position=3)
    private String phoneNumber;

    public Employee () {
    }  

然而,在 spring 转换器转换后,java pojo 中“name”的值将是 ex:Joe/Dowwel(带有分隔符“/”)

我的要求是在 Employee POJO 中有 2 个单独的字段“firstName”和“lastName”,以便我可以将其拆分和分离,例如“firstName”= Joe 和“lastname”= Dowwel。

有什么方法可以使用更清洁的方法来实现它。也许使用更多注释来过滤?

如有任何帮助,我们将不胜感激。提前致谢。

最佳答案

显然您的输入数据没有映射到您的类结构。 Square peg, round hole.这里没有神奇的解决方案。

您必须:

  • 修复数据源,要求数据发布者将name单个字段拆分为一对字段given_name & surname
  • 在您端解析数据,将单个值分成一对值。

第一个选项是理想的。与其事后窃取数据,不如首先正确传达数据。

如果这不可能,您必须找到解决方法。

我想到的第一个解决方法是,Employee 类上有一个构造函数,它接受传入的组合名称并将其拆分为其他两个字段。请参阅String::split

但是,在当前代码中使用该解决方法意味着除了名字和姓氏成员字段之外,还需要在 Employee 上定义一个冗余的 name 成员字段。因此,另一个解决方法是不使用 CSV 库的绑定(bind)功能。相反,编写一些代码来读取 CSV 的每个字段并将其传递给 Employee 的构造函数。当遇到 name 字段时,将其拆分,然后将两个部分传递给构造函数。

关于java - 如何使用自定义拆分器拆分由分隔符分隔的 csv 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56197766/

相关文章:

java - SpringApplication.run() 方法完成之前有很大的延迟

java - 在框架中添加 JLabel?

angular - 从 Angular 和 Spring MVC API 下载文件

java - 当页面没有元素时返回空的 "content"数组

spring - Spring中过滤器的异常处理

eclipse - 安装 Java 库

java - 可靠的 FIFO 消息传递 Java

java - 如何使用 opencsv 将整数值写入 csv 文件

java - 使用生产者-消费者模式处理巨大的 CSV 文件

java - 如何使用 Jsmooth 为我的 java 程序创建 .exe?