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;
    }

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

相关推荐
WaaTong3 分钟前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
m0_743048443 分钟前
初识Java EE和Spring Boot
java·java-ee
AskHarries5 分钟前
Java字节码增强库ByteBuddy
java·后端
小灰灰__25 分钟前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea
夜雨翦春韭28 分钟前
Java中的动态代理
java·开发语言·aop·动态代理
程序媛小果1 小时前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot
追风林1 小时前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
芒果披萨1 小时前
El表达式和JSTL
java·el
duration~2 小时前
Maven随笔
java·maven
zmgst2 小时前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql