การตรวจสอบรูปแบบ

การทำความสะอาดข้อมูลใน Java

Dennis Lee

Software Engineer

ทำไมต้องตรวจสอบรูปแบบ

  • ข้อมูลต้องอยู่ในรูปแบบที่กำหนดเพื่อความถูกต้อง
  • ตัวอย่าง: วันที่ควรมีรูปแบบสม่ำเสมอ เช่น d-MMM-yy
  • ปัญหา: รูปแบบวันที่ไม่สม่ำเสมอ เช่น "24/02/22"
  • วิธีแก้: ใช้การตรวจสอบรูปแบบเพื่อหาข้อมูลที่ไม่ตรงรูปแบบ

 

// We extracted these dates from our dataset
List<String> dates = Arrays.asList("4-Jan-22", "1-Aug-22", "7-Jul-22", 
                                   "27-Apr-22", "24/02/22");
การทำความสะอาดข้อมูลใน Java

การตรวจสอบรูปแบบ 3 ประเภท

  • การจับคู่รูปแบบเต็ม
    • ใช้เมื่อต้องการให้รูปแบบตรงทุกตำแหน่ง
    • ตัวอย่าง: ตรวจสอบวันที่ที่ตรงรูปแบบ d-MMM-yy
  • การค้นหารูปแบบ
    • ใช้เมื่อไม่จำเป็นต้องระบุตำแหน่งที่แน่นอน
    • ตัวอย่าง: ค้นหาหมวดหมู่สินค้าในคำอธิบาย
    • สินค้าที่มี "Dark Chocolate": "85% Dark Chocolate Bar", "Dark Chocolate with Nuts"
  • การจับคู่อักขระ
    • ใช้สำหรับคัดกรองข้อมูลเบื้องต้น
    • ตัวอย่าง: ตรวจสอบว่าฟิลด์จำนวนมีตัวอักษรหรือไม่ ("12.5x")
การทำความสะอาดข้อมูลใน Java

กำหนดรูปแบบด้วย regex

  • จับคู่รูปแบบวันที่ d-MMM-yy (เช่น "4-Jan-22")
  • Regex: \\d{1,2}-[A-Za-z]{3}-\\d{2}

 

\\d{1,2}     // 1-2 digits for day (like 4 or 27)
-            // literal hyphen separator

[A-Za-z]{3} // exactly 3 letters for month like Jan; uppercase or lowercase - // literal hyphen separator
\\d{2} // exactly 2 digits for year (like 22)
การทำความสะอาดข้อมูลใน Java

การจับคู่รูปแบบเต็ม

import java.util.regex.Pattern;
// Match d-MMM-yy
Pattern datePattern = Pattern.compile("\\d{1,2}-[A-Za-z]{3}-\\d{2}");

for (String date : dates) { // Check if date matches datePattern boolean isValid = datePattern.matcher(date).matches(); System.out.println(date + " is valid: " + isValid); }
การทำความสะอาดข้อมูลใน Java

การจับคู่รูปแบบเต็ม: ผลลัพธ์

4-Jan-22 is valid: true
1-Aug-22 is valid: true
7-Jul-22 is valid: true
27-Apr-22 is valid: true
24/02/22 is valid: false
การทำความสะอาดข้อมูลใน Java

การค้นหารูปแบบ

import java.util.regex.Matcher;
Pattern monthPattern = Pattern.compile("[A-Za-z]{3}"); // 3 letters like "Jan"

for (String date : dates) { Matcher matcher = monthPattern.matcher(date); // Is monthPattern in date?
if (matcher.find()) { // Returns true if the pattern is found
// matcher.group() returns the matched content System.out.println("Month found: " + matcher.group()); } else { System.out.println("No month found in: " + date); } }
การทำความสะอาดข้อมูลใน Java

การค้นหารูปแบบ: ผลลัพธ์

Month found: Jan
Month found: Aug
Month found: Jul
Month found: Apr
No month found in: 24/02/22
การทำความสะอาดข้อมูลใน Java

การจับคู่อักขระ

import com.google.common.base.CharMatcher;
for (String date : dates) {
    boolean isValid =
            // Check for digits in date
            CharMatcher.inRange('0', '9').matchesAnyOf(date) &&

// Check for letters (uppercase and lowercase) in date CharMatcher.inRange('a', 'z') .or(CharMatcher.inRange('A', 'Z')).matchesAnyOf(date) &&
CharMatcher.is('-').matchesAnyOf(date); // Check for hyphens in date System.out.println(date + " has valid characters: " + isValid); }
การทำความสะอาดข้อมูลใน Java

การจับคู่อักขระ: ผลลัพธ์

4-Jan-22 has valid characters: true
1-Aug-22 has valid characters: true
7-Jul-22 has valid characters: true
27-Apr-22 has valid characters: true
24/02/22 has valid characters: false
การทำความสะอาดข้อมูลใน Java

สรุปภาพรวม

// Define pattern d-MMM-yy, like 4-Jan-22
Pattern datePattern = Pattern.compile("\\d{1,2}-[A-Za-z]{3}-\\d{2}");
// Full pattern matching (does date match datePattern?)
boolean matchesPattern = datePattern.matcher(date).matches();
// Pattern finding (does date have a month substring?)
boolean hasMonth = Pattern.compile("[A-Za-z]{3}").matcher(date).find();
// Character matching (does date have digits?)
boolean hasDigits = CharMatcher.digit().matchesAnyOf(date);
การทำความสะอาดข้อมูลใน Java

มาฝึกกันเถอะ!

การทำความสะอาดข้อมูลใน Java

Preparing Video For Download...