iT邦幫忙

1

day 12 了解正確處理包含逗號或雙引號的欄位(CSV escape)

  • 分享至 

  • xImage
  •  

.csv 全名是 Comma-Separated Values(逗號分隔值)
簡單來說,它是一種文字檔的表格格式,每一行是一筆資料,每一個欄位用「逗號 ,」隔開,CSV是可以被 Excel 打開的文字檔形式的表格。

CSV 優點:
幾乎所有系統都支援,Excel、Google 試算表、Python、Java 都能讀。
方便紀錄結果,做 port scanner 就可以把掃描結果存下來。
可以之後做分析,未來學「多執行緒掃描」或「統計分析」時很好用。

CSV 規則常用做法:如果欄位包含逗號或雙引號或換行,整個欄位用雙引號包起來,欄位內的雙引號則寫成 ""(兩個雙引號)。
如果資料裡面自己就有逗號或雙引號,CSV 會誤判。所以這時就要「逃脫(escape)」,確保 CSV 不會誤讀。當資料裡有特殊符號時,用特殊寫法「保護」它,讓資料能安全地被程式正確讀取。

例如:
因為 Java 的字串本身是用雙引號包起來的,比如:
String s = "Hello";
如果你直接打這樣:
String s = "He said "Hi"";
編譯會錯,因為 Java 會以為 "He said " 是一個字串,後面的 "Hi" 又是另一個。
要讓字串裡真的包含一個 ",你就必須**跳脫(escape)**它:
String s = "He said "Hi"";
結果輸出:
He said "Hi"

package day1;
import java.io.IOException;
import java.io.FileWriter;
import java.io.BufferedWriter;

public class Day12Demo {
private static String escapeCsv(String field){
if(field == null) return"";
boolean needQuote =field.contains(",") || field.contains(""")||field.contains("\n") || field.contains("\r");
if (field.contains(""")){
field = field.replace(""","""");
}return needQuote ? """ + field +""" : field;
}
public static void main(String[] args) {
String filename = "Day12Demo.csv";

    String[] header = {"timestamp", "host", "port", "status", "note"};
    String[] row1 = {"2025-10-06 15:30", "localhost", "22", "OPEN", "no problem"};
    String[] row2 = {"2025-10-06 15:30", "example.com", "443", "OPEN", "response: \"OK\", fast"};
    String[] row3 = {"2025-10-06 15:30", "somehost", "8080", "CLOSED", "contains,comma"};

    try (BufferedWriter bw = new BufferedWriter(new FileWriter(filename))) {
        for (int i = 0; i < header.length; i++) {
            if (i > 0) bw.write(",");
            bw.write(escapeCsv(header[i]));

        }
        bw.newLine();

        String[][] rows = {row1, row2, row3};
        for (String[] row : rows) {
            for (int i = 0; i < row.length; i++) {
                if (i > 0) bw.write(",");
                bw.write(escapeCsv(row[i]));
            }
            bw.newLine();
        }
        System.out.println("已寫入 " + filename);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}
https://ithelp.ithome.com.tw/upload/images/20251007/20179429QCha5eoM7t.png

https://ithelp.ithome.com.tw/upload/images/20251007/2017942903JH3nbGz5.png
今天學到了CSV的應用,用上面程式碼成功存進表格(.csv檔裡),也知道 Java 中怎麼讓資料存起來不會被誤判能順利存進去。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言