java解析CSV文件(一)——Java使用Apache.Commons.CSV解析CSV文件应用实践

在实际工作中,利用java对excel文件的解析做导入导出的业务异常频繁。但其实最简单的还是利用.csv文件对其数据进行保存或者导出。其全名是Comma Separated Values。它是一种纯文本文件,用于存储表格和电子表格信息。每行表示一条记录,字段之间通常用逗号(,)分隔,也可能使用分号(;)、制表符(\t)或其他分隔符。CSV 文件因其简单性、跨平台兼容性和易于解析的特点,广泛用于数据交换、数据库导入导出、数据分析等场景。

本文基于springboot2+Apache Commons CSV核心包来解析CSV文件,其他相关业务是直接拷贝使用。

一.csv文件和其他格式数据对比

二.Java使用Apache.Commons.CSV解析CSV文件应用实例

1.springboot项目引入commons-csv的pom信息
<dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-csv</artifactId>
            <version>1.10.0</version>
        </dependency>
2.根据csv文件表头信息映射构建java对象

/**
 * CSV文件映射对象
 *
 */

@Data
public class MibMappingObj implements Serializable {

    //序号
    private Integer index;
    //设备类型ID
    private String deviceTypeId;
    private String deviceId;          //设备ID
    private String deviceName;          //设备名称
    private String oidStr;          // OID参数
    private String signalId;          //信号ID
    private String mqSgId;          //消息服务信号ID
    private String signalCnName;          // 信号中文名称
    private String signalEnName;          // 信号英文名称
    private String unitName;          //单位名称
    private Integer snmpPrecision;          //SNMP精度
    private String cnState;          //状态量中文名
    private String enState;          //状态量英文名
    private Integer signalType;          //信号类型
    /*
    private String mibSignalName;   // MIB信号名称
    private String suffixOid;          // Suffix OID
    private String index;             // 索引

    private String signalType;        // 信号类型: 0只读, 1可写, 2设置参数

    private String flag;              // 标记
*/
    // 获取完整OID
    public String getFullOid(String baseOid) {
        return baseOid + "." + oidStr + "." + index;
    }

    // 判断是否为有效信号
    public boolean isValidSignal() {
        return signalId == null || "".equals(signalId) || "-9999".equals(signalId);
    }

    //判断是不是有效的单位
    public boolean isValidUnit() {
        return unitName == null || "".equals(unitName)
                || "NA".equals(unitName) || "-".equals(unitName);
    }
}
3.使用Apache.Commons.CSV解析CSV文件

    //定义CSV文件项目路径
    @Value("${file.csv-path}")
    private Resource csvResource;



    /**
     * 项目初始化时加载csv文件数据
     */
    @PostConstruct
    public void loadMappings() {
        List<MibMappingObj> mappings = new ArrayList<>();
        InputStreamReader csvReaderInput = null;
        CSVParser csvParser = null;
        try {
            csvReaderInput = new InputStreamReader(csvResource.getInputStream(), "UTF-8");
            //解决record.toMap()后通过get()获取第一行数据为null的问题
            csvParser = new CSVParser(csvReaderInput, CSVFormat.DEFAULT
                    .withFirstRecordAsHeader()
                    .withIgnoreHeaderCase()
                    .withTrim());
            Map<String, String> csvRecordMap = null;
            MibMappingObj mapping = null;
            for (CSVRecord record : csvParser) {
                csvRecordMap = record.toMap();
                mapping = new MibMappingObj();
                mapping.setIndex(Integer.parseInt(csvRecordMap.get("序号index")));
                mapping.setDeviceTypeId(csvRecordMap.get("设备类型ID"));
                mapping.setDeviceId(csvRecordMap.get("设备ID"));
                mapping.setDeviceName(csvRecordMap.get("设备名字deviceName"));
                mapping.setOidStr(csvRecordMap.get("OID"));
                mapping.setSignalId(csvRecordMap.get("信号ID"));
                mapping.setMqSgId("sg"+mapping.getIndex()+mapping.getSignalId());
                mapping.setSignalCnName(csvRecordMap.get("信号中文名signalCnName"));
                mapping.setSignalEnName(csvRecordMap.get("信号英文名signalEnName"));
                mapping.setUnitName(csvRecordMap.get("单位"));
                mapping.setSnmpPrecision(StringUtils.isNotEmpty(csvRecordMap.get("SNMP精度")) ? Integer.parseInt(csvRecordMap.get("SNMP精度")) : 1);
                mapping.setSignalType(StringUtils.isNotEmpty(csvRecordMap.get("信号类型")) ? Integer.parseInt(csvRecordMap.get("信号类型")) : 0);
                mappings.add(mapping);
            }
            log.info("CSV映射表加载完成————》总条目数:{}", mappings.size());
        } catch (Exception e) {
            log.error("加载CSV映射表失败", e);
            e.printStackTrace();
            throw new RuntimeException("无法加载CSV映射表", e);
        }finally {
            try {
                csvParser.close();
                csvReaderInput.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值