需求: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; }
輸出結果:得到了想要的結果