資料型別驗證

使用 Java 進行資料清理

Dennis Lee

Software Engineer

為何要檢查資料型別?

  • 需要從外部資料來源解析文字
  • 無效的資料型別會造成執行期錯誤
  • 適當驗證可避免程式當機

 

String priceText = "$30.61";
double price = Double.parseDouble(priceText);  // 失敗:$ 不屬於數字
Exception in thread "main" java.lang.NumberFormatException
使用 Java 進行資料清理

驗證數字文字

// 數字驗證工具
import org.apache.commons.lang3.math.NumberUtils; 
String reviewCountText = "165";
System.out.println(NumberUtils.isParsable(reviewCountText));
true
String priceText = "$30.61"; // 非法數字
System.out.println(NumberUtils.isParsable(priceText)); // false:含有 $ 符號
false
使用 Java 進行資料清理

解析數字文字

private static String validateNumeric(String value) {
    if (NumberUtils.isParsable(value)) return value;  // 合法數字就回傳
    throw new IllegalArgumentException("Invalid: " + value);  // 否則拋出錯誤
}

int reviews = Integer.parseInt(validateNumeric("165"));  // 先驗證再解析

// 先移除 $ double price = Double.parseDouble(validateNumeric("$30.61".replace("$", ""))); System.out.println("reviews: " + reviews + "\nprice in $: " + price);
reviews: 165
price in $: 30.61
使用 Java 進行資料清理

驗證日期格式

import java.time.format.DateTimeFormatter; // 日期樣式格式化
private static LocalDate parseDate(String dateStr) {
    DateTimeFormatter format = DateTimeFormatter.ofPattern("M/d/yy");

return LocalDate.parse(dateStr, format); // 將字串轉為 LocalDate }
LocalDate date = parseDate("1/10/23"); // "1/10/23" 會轉成 2023-01-10 System.out.println("Date: " + date);
Date: 2023-01-10
使用 Java 進行資料清理

結合數字與日期驗證

private static double parsePrice(String price) {
    return Double.parseDouble(validateNumeric(price.replace("$", "")); // 去除 $
}


// 將 CSV 欄位轉為 BookSales public static BookSales parseSalesData(String[] fields) { String title = fields[0]; LocalDate publishDate = parseDate(fields[1]); // 自訂日期解析 int reviews = Integer.parseInt(validateNumeric(fields[2])); double rating = Double.parseDouble(validateNumeric(fields[3])); double price = parsePrice(fields[4]); // 處理幣別格式 return new BookSales(title, publishDate, reviews, rating, price); }
使用 Java 進行資料清理

安全讀取 CSV 檔

List<BookSales> sales = new ArrayList<>(); // 儲存 BookSales 物件


try (BufferedReader reader = new BufferedReader(new FileReader("book_sales.csv"))) {
String line = reader.readLine(); // 略過標題列
while ((line = reader.readLine()) != null) { // 讀到檔案結尾為止 String[] fields = line.split(","); // 將 CSV 行切成陣列 sales.add(parseSalesData(fields)); // 轉為 BookSales 物件 } }
sales.forEach(System.out::println); // 列印每筆銷售
BookSales[title=Python Crash Course, publishDate=2023-01-10, 
reviewCount=165, rating=4.8, price=30.61]
使用 Java 進行資料清理

總結:資料型別驗證

  • 解析前先驗證文字,避免執行期錯誤
  • 重要匯入
    • org.apache.commons.lang3.math.NumberUtils
    • java.time.format.DateTimeFormatter
  • NumberUtils.isParsable() 檢查數字字串
  • DateTimeFormatter 處理多種日期格式
  • 捕捉型別問題可確保資料完整性
使用 Java 進行資料清理

一起來練習吧!

使用 Java 進行資料清理

Preparing Video For Download...