漁人一柒 2024-02-19 20:26 采纳率: 0%
浏览 4

openCSV sql

求openCSV对json字段下一些key的映射方法?
解析csv文件,提取某些字段特别对于json字段的解析,提取某些key,并生成新的csv文件

img

img

img

img

  • 写回答

1条回答 默认 最新

  • Maka Baka+ + 2024-02-20 18:42
    关注

    从您提供的代码和图片中可以看出,您正在尝试使用openCSV库将CSV文件中的数据映射到Java对象中。对于CSV文件中包含的JSON字段,您希望能够解析该JSON字段,并且从中抽取特定的键值对,并将它们作为独立的字段写入新的CSV文件。

    在您的Oder类中,您定义了idtypesortage作为属性,但根据您的最后一张图片,JSON数据似乎也包含name键。如果您想进一步提取JSON中的name字段,您需要在Oder类中添加一个对应的属性。

    首先,您需要确保您的Oder类可以处理这种情况。例如,您可能需要一个新的字段来存储JSON字段中的name值:

    @Data
    public class Oder {
        private String id;
        private String type;
        private String sort;
        private Integer age;
        private String name; // 新增字段
    }
    

    然后,您需要一种方法来解析CSV中的JSON列,并为该列中的每个键设置正确的字段。您可以使用一个自定义的转换器来解析JSON并设置Oder对象的属性。这里有一个简化的示例,其中CustomBinding类是您需要实现的自定义类:

    import com.opencsv.bean.AbstractBeanField;
    import com.opencsv.exceptions.CsvConstraintViolationException;
    import com.opencsv.exceptions.CsvDataTypeMismatchException;
    import org.json.JSONObject;
    
    public class CustomBinding extends AbstractBeanField<Oder, String> {
        @Override
        protected Object convert(String value) throws CsvDataTypeMismatchException, CsvConstraintViolationException {
            JSONObject jsonObject = new JSONObject(value);
            Oder order = new Oder();
            order.setId(jsonObject.optString("id"));
            order.setType(jsonObject.optString("type"));
            order.setSort(jsonObject.optString("sort"));
            order.setAge(jsonObject.optInt("age"));
            order.setName(jsonObject.optString("name")); // 解析并设置name属性
            return order;
        }
    }
    

    接下来,您需要在您的映射策略中指定这个自定义的转换器。例如,如果您的JSON数据位于名为jsonData的CSV列中,您的映射策略可能看起来像这样:

    ColumnPositionMappingStrategy<Oder> strategy = new ColumnPositionMappingStrategy<>();
    strategy.setType(Oder.class);
    String[] columns = new String[]{"id", "type", "sort", "age", "jsonData"}; // CSV的列名
    strategy.setColumnMapping(columns);
    strategy.setType(Oder.class);
    

    在CSV读取过程中,对于jsonData列,您需要使用自定义的转换器来解析它。您可以通过注册转换器的方式来做:

    CsvToBeanBuilder<Oder> beanBuilder = new CsvToBeanBuilder<>(reader);
    beanBuilder.withType(Oder.class);
    beanBuilder.withMappingStrategy(strategy);
    beanBuilder.withConverter("jsonData", new CustomBinding()); // 注册转换器
    List<Oder> orders = beanBuilder.build().parse();
    

    最后,您可以将解析出的List<Oder>对象写入新的CSV文件中,这个步骤您似乎已经掌握了。

    请注意,您需要根据您实际的情况调整代码,我的代码只是提供一个大致的方向。您可能需要加入异常处理,以及针对JSON结构的特定细节进行调整。您可能还需要引入JSON处理库如org.jsoncom.fasterxml.jackson.databind,如果您还没有这样做的话。
    部分参考于gpt3.5

    评论

报告相同问题?

问题事件

  • 创建了问题 2月19日

悬赏问题

  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 组策略中的计算机配置策略无法下发
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)