java 读取csv 文件

csv 格式 本质 上位文本类型数据,目前解析方式查找过来就一种,需要注意的就是在读取csv前需要知道csv编码格式才可以正确解析
/**
 * 获取流对应的编码类型
 * @param bb
 * @return
 * @throws Exception
 */
public static String getCharSet(BufferedInputStream bb) throws Exception {

    String charSet = null;
 byte[] buffer = new byte[3];
 //因流读取后再读取可能会缺少内容,此处需要先读,然后再还原
 bb.mark(bb.available() + 1);
 bb.read(buffer);
 bb.reset();
 String s = Integer.toHexString(buffer[0] & 0xFF) + Integer.toHexString(buffer[1] & 0xFF) + Integer.toHexString(buffer[2] & 0xFF);
 switch (s) {
        //GBK,GB2312对应均为d5cbba,统一当成GB2312解析
 case "d5cbba":
            charSet = "GB2312";
 break;
 case "efbbbf":
            charSet = "UTF-8";
 break;
 default:
            charSet = "GB2312";
 break;
 }

    return charSet;
}


/**
 * 读取CSV文件内容
 *
 * @param inputStream 文件存放的路径,如:D:/csv/xxx.csv
 * @return List<T>
 */
public static List<Map<String, Object>> readCSVFileData(InputStream inputStream, String csvCode,Map<String, String> columns, List<String> headers) {
    List<Map<String, Object>> resultList = new ArrayList<>();
 CsvReader reader = null;
 try {
        // 创建CSV读对象 例如:CsvReader(文件路径,分隔符,编码格式);
 reader = new CsvReader(inputStream, ',', Charset.forName(csvCode));
 if (reader != null) {
            // 跳过表头,如果需要表头的话,这句可以忽略
 reader.readHeaders();
 // 逐行读入除表头的数据
 while (reader.readRecord()) {
                String[] datas = reader.getHeaders();
 if (LogicUtil.isNotEmpty(datas) && datas.length > 0) {
                    headers = Arrays.asList(datas);
 }
                Map<String, Object> stringObjectMap = new HashMap<>();
 String[] data = reader.getValues();
 for (int i = 0; i < headers.size(); i++) {
                    if (i >= data.length) {
                        stringObjectMap.put(columns.get(headers.get(i)), "");
 } else {
                        stringObjectMap.put(columns.get(headers.get(i)), data[i]);
 }
                }
                resultList.add(stringObjectMap);
 }
            if (!resultList.isEmpty()) {
                // 数组转对象
 return resultList;
 }
        }
    } catch (Exception e) {

    } finally {
        if (reader != null) {
            reader.close();
 }
    }
    return Collections.emptyList();
}

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值