使用特定的POJO字段映射csv文件的特定列

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (31)

我必须根据具有特定POJO属性的索引映射特定的CSV列。映射将基于一个json文件,该文件将包含columnIndex和属性名称,这意味着对于来自csv文件的特定columnIndex,您必须映射Pojo类中的特定属性。下面是一个json文件示例,它显示了具有Pojo属性的列映射策略。

[{ “索引”:0 “列名”: “日期”},{ “索引”:1, “COLUMNNAME”: “deviceAddress”},{ “索引”:7, “COLUMNNAME”: “IPADDRESS”},{ “索引”:3 “列名”: “的userName”},{ “索引”:10 “列名”: “基团”},{ “索引”:5 “列名”: “eventCategoryName”},{“索引“:6,” COLUMNNAME “:” 消息“}]

我已经尝试过使用OpenCSV库,但我遇到的挑战是我无法用它读取部分列。如上面的json,你可以看到我们正在跳过索引2和4来读取CSV文件。下面是openCSV文件的代码。

public static List<BaseDataModel> readCSVFile(String filePath,List<String> columnListBasedOnIndex) {
        List<BaseDataModel> csvDataModels = null;
        File myFile = new File(filePath);
        try (FileInputStream fis = new FileInputStream(myFile)) {
            final ColumnPositionMappingStrategy<BaseDataModel> strategy = new ColumnPositionMappingStrategy<BaseDataModel>();
            strategy.setType(BaseDataModel.class);


            strategy.setColumnMapping(columnListBasedOnIndex.toArray(new String[0]));

            final CsvToBeanBuilder<BaseDataModel> beanBuilder = new CsvToBeanBuilder<>(new InputStreamReader(fis));
            beanBuilder.withMappingStrategy(strategy);

            csvDataModels = beanBuilder.build().parse();

        } catch (Exception e) {
            e.printStackTrace();
        }
}


List<ColumnIndexMapping> columnIndexMappingList = dataSourceModel.getColumnMappingStrategy();
                    List<String> columnNameList = columnIndexMappingList.stream().map(ColumnIndexMapping::getColumnname)
                            .collect(Collectors.toList());

List<BaseDataModel> DataModels = Utility
                                    .readCSVFile(file.getAbsolutePath() + File.separator + fileName, columnNameList);

我也尝试过univocity但是使用这个库我怎么能用特定属性映射csv。以下是代码 -

CsvParserSettings settings = new CsvParserSettings();
        settings.detectFormatAutomatically(); //detects the format 
        settings.getFormat().setLineSeparator("\n");
        //extracts the headers from the input
        settings.setHeaderExtractionEnabled(true);
        settings.selectIndexes(0, 2); //rows will contain only values of columns at position 0 and 2
        CsvRoutines routines = new CsvRoutines(settings); // Can also use TSV and Fixed-width routines
        routines.parseAll(BaseDataModel.class, new File("/path/to/your.csv"));


        List<String[]> rows = new CsvParser(settings).parseAll(new File("/path/to/your.csv"), "UTF-8");

请看看在这种情况下有人可以帮助我。

提问于
用户回答回答于

这里是univocity-parsers的作者。您可以在代码而不是注释中定义类属性的映射。像这样的东西:

public class BaseDataModel {
    private String a;
    private int b;
    private String c;
    private Date d;
}

然后在您的代码上,将属性映射到您需要的任何列名称:

ColumnMapper mapper = routines.getColumnMapper();
mapper.attributeToColumnName("a", "col1");
mapper.attributeToColumnName("b", "col2");
mapper.attributeToColumnName("c", "col3");
mapper.attributeToColumnName("d", "col4");

您还可以使用mapper.attributeToIndex("d", 3);将属性映射到给定的列索引。

希望这可以帮助。

热门问答

如何将本地的.json格式的文件部署到服务器上, 通过url请求?

使用 CDS-Mask 做数据合作,怎么确保双方都不能反推对方的 ID?

用户2134289

腾讯科技 · 高级工程师 (已认证)

推荐
您好,两种方案可以解决您的需求 1)如果您这边ID不需要在业务上使用,将ID进行加星脱敏即可,加星后的所有数据字符将变为*,无法还原; 2)如果您这边ID在业务上需要使用,也就是ID在处理后必须保持唯一性,那么需要采用腾讯数港算法解决该问题,数港算法目前灰度中,如需要申请,烦请通...... 展开详请

MySQL还要另外购买吗?

蒋小爱

腾讯云 · 技术支持 (已认证)

推荐已采纳
您好,您可在服务器中自建MySQL ,同时腾讯云提供数据库 MySQL(TencentDB for MySQL)让用户可以轻松在云端部署、使用 MySQL 数据库。MySQL 是世界上最流行的开源关系数据库,通过云数据库 MySQL,您在几分钟内即可部署可扩展的 MySQL ...... 展开详请

实时语音识别支持c#平台吗?

支持的。虽然SDK没有C#的,但是可以通过API进行请求

腾讯一句话语音识别为什么识别不了微信公众号临时下载的语音?

腾讯云智能语音服务员

腾讯 · 社区FAQ (已认证)

推荐

如果只是单纯的转换后缀,那么仍然还是没办法识别的,需要用特定的工具转化为正常的wav类型音频。识别结果为空有可能是采样率不匹配,目前一句话识别只支持8k和16k的采样率的音频识别。

无服务器云函数可以通过api直接接收formdata的图片吗?

Mason-Serverless

腾讯 · 产品经理 (已认证)

推荐
通过网关上传前,需要先自己做base64 encode,然后在event里直接读body,转成文件。 控制台上有demo参考:图片转文字 local_path = u'/tmp/{}'.format(file_name) with open(local_path, 'w...... 展开详请

所属标签

扫码关注云+社区

领取腾讯云代金券