java split用法 案例

需求:java读取一个csv文件并将文件内容每行按照","隔开

场景一:

读取1.csv文件:文件内容如下:

1,zhangsan,note

2,lisi,

注意:第二行逗号后面没有数据

复制代码
public static void main(String[] args) {
        String csvFile = "C:\\Users\\yc\\Desktop\\1.csv";
        String line;
        try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
            // 读取CSV文件的每一行
            while ((line = br.readLine()) != null) {
                // 根据分隔符拆分行数据
                String[] data = line.split(",");
                // 打印行数据
                System.out.println("-----------长度:"+data.length);
                for(int i=0;i<data.length;i++){
                    System.out.println(data[i]);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

输出结果:两行分割后数据长度不一样

如何让分割后的长度一样,避免下标溢出报错?修改代码,重点如下红色部分line.split(",",-1);加个-1

复制代码
public static void main(String[] args) {
        String csvFile = "C:\\Users\\yc\\Desktop\\1.csv";
        String line;
        try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
            // 读取CSV文件的每一行
            while ((line = br.readLine()) != null) {
                // 根据分隔符拆分行数据
                String[] data = line.split(",",-1);
                // 打印行数据
                System.out.println("-----------长度:"+data.length);
                for(int i=0;i<data.length;i++){
                    System.out.println(data[i]);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

输出结果:长度一样了,第二行输出了一个空,如下图所示。

场景二:

读取2.csv文件:文件内容如下:

aaa,"[123213,123123]",bbbb

想分割成aaa,"[123213,123123]"和bbbb

上代码如下:

复制代码
 public static void main(String[] args) {
        String csvFile = "C:\\Users\\yc\\Desktop\\2.csv";
        String line;
        try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
            // 读取CSV文件的每一行
            while ((line = br.readLine()) != null) {
                // 根据分隔符拆分行数据
                String[] data = line.split(",",-1);
                // 打印行数据
                System.out.println("-----------长度:"+data.length);
                for(int i=0;i<data.length;i++){
                    System.out.println(data[i]);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

输出结果:事与愿违并没有出处想要的结果

修改代码:

复制代码
public static void main(String[] args) {
        String csvFile = "C:\\Users\\yc\\Desktop\\2.csv";
        String line;
        try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
            // 读取CSV文件的每一行
            while ((line = br.readLine()) != null) {
                // 根据分隔符拆分行数据
                List<String> data = splitString(line);
                // 打印行数据
                System.out.println("-----------长度:"+data.size());
                for(int i=0;i<data.size();i++){
                    System.out.println(data.get(i));
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static List<String> splitString(String text) {
        List<String> result = new ArrayList<>();
        boolean inQuotes = false;
        StringBuilder sb = new StringBuilder();

        for (char c : text.toCharArray()) {
            if (c == '\"') {
                inQuotes = !inQuotes;
                sb.append(c);
            } else if (c == ',' && !inQuotes) {
                result.add(sb.toString());
                sb.setLength(0);
            } else {
                sb.append(c);
            }
        }
        result.add(sb.toString());

        return result;
    }

输出结果:得到了想要的结果

相关推荐
L***d6702 小时前
Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)
java·数据库·spring boot
凌波粒2 小时前
Springboot基础教程(3)--自动装配原理/静态资源处理/欢迎页
java·spring boot·后端
likuolei2 小时前
XSL-FO 软件
java·开发语言·前端·数据库
凌波粒2 小时前
SpringBoot基础教程(2)--yaml/配置文件注入/数据校验/多环境配置
java·spring boot·后端·spring
S***26752 小时前
Spring Boot环境配置
java·spring boot·后端
6***83052 小时前
什么是Spring Boot 应用开发?
java·spring boot·后端
毕设源码柳学姐2 小时前
计算机毕设 java 智慧社区服务系统 SSM 框架社区生活平台 Java 开发的便民服务与互动系统
java·开发语言·生活
U***l8322 小时前
【postgresql】分区表管理
java·数据库·postgresql
倚肆2 小时前
MyBatis-Plus Mapper 接口方法详解
java·mybatis
n***78682 小时前
SpringBoot详解
java·spring boot·后端