Очищення даних у Java
Dennis Lee
Software Engineer
String priceText = "$30.61";
double price = Double.parseDouble(priceText); // Fails: $ not valid in number
Exception in thread "main" java.lang.NumberFormatException
// Утиліта для перевірки чисел
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
private static String validateNumeric(String value) { if (NumberUtils.isParsable(value)) return value; // Return if valid number throw new IllegalArgumentException("Invalid: " + value); // Else throw error } int reviews = Integer.parseInt(validateNumeric("165")); // Validate then parse// Спочатку приберіть $ double price = Double.parseDouble(validateNumeric("$30.61".replace("$", ""))); System.out.println("reviews: " + reviews + "\nprice in $: " + price);
reviews: 165
price in $: 30.61
import java.time.format.DateTimeFormatter; // Для форматування шаблонів дат
private static LocalDate parseDate(String dateStr) { DateTimeFormatter format = DateTimeFormatter.ofPattern("M/d/yy");return LocalDate.parse(dateStr, format); // Convert string to LocalDate }LocalDate date = parseDate("1/10/23"); // "1/10/23" конвертується у 2023-01-10 System.out.println("Date: " + date);
Date: 2023-01-10
private static double parsePrice(String price) { return Double.parseDouble(validateNumeric(price.replace("$", "")); // Remove $ }// Перетворення полів 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); }
List<BookSales> sales = new ArrayList<>(); // Зберігання об'єктів BookSalestry (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]
org.apache.commons.lang3.math.NumberUtilsjava.time.format.DateTimeFormatterNumberUtils.isParsable() для перевірки числових рядківDateTimeFormatterОчищення даних у Java