java split用法 案例

万笑佛發表於2024-05-14

需求: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;
    }

輸出結果:得到了想要的結果


相關文章