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

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

相关推荐
小羊没烦恼!5 小时前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里5 小时前
java中的继承和多态的区别
java
小羊没烦恼!5 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕5 小时前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码5 小时前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖6 小时前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时6 小时前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang6 小时前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
ba_pi7 小时前
mysql 查询所有表名并授权
java
ProcessOn官方账号7 小时前
java函数式编程--入门基础
java·编程·函数式编程