在实际工作中,利用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();
}
}
}

689

被折叠的 条评论
为什么被折叠?



