数据类型校验

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 数据清洗

Passons à la pratique !

Java 数据清洗

Preparing Video For Download...