Text.StartsWith ตรวจสอบว่าข้อความหลักขึ้นต้นด้วยข้อความย่อยที่กำหนดหรือไม่ โดยคืนค่า true หรือ false สามารถระบุ Comparer เพื่อเลือกว่าจะให้ตรวจสอบแบบ Case Sensitive (ไว) หรือ Case Insensitive (ไม่ไว) ได้
| อาร์กิวเมนต์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
| text | text | ข้อความหลักที่ต้องการตรวจสอบว่าขึ้นต้นด้วยข้อความย่อยหรือไม่ สามารถเป็น null ได้ | |
| substring | text | ข้อความย่อยที่ต้องการตรวจสอบว่าข้อความหลักขึ้นต้นด้วยข้อความนี้หรือไม่ | |
| [comparer]ไม่บังคับ | function | Comparer.Ordinal | ฟังก์ชัน Comparer สำหรับการเปรียบเทียบ เช่น Comparer.Ordinal (case-sensitive) หรือ Comparer.OrdinalIgnoreCase (case-insensitive) หากไม่ระบุจะใช้ Comparer.Ordinal เป็นค่าเริ่มต้น |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
ฟังก์ชัน Text.StartsWith เป็นฟังก์ชันพื้นฐานสำหรับตรวจสอบว่าข้อความหลักขึ้นต้นด้วยข้อความย่อย (substring) ที่กำหนดหรือไม่ โดยจะคืนค่าเป็น true หากขึ้นต้นตรงกัน และ false หากไม่ตรงกัน เมื่อข้อความหลักเป็น null ฟังก์ชันจะคืนค่า null
ที่เจ๋งคือเราสามารถควบคุมว่าจะให้ตรวจสอบแบบ Case Sensitive (แยกตัวพิมพ์เล็ก-ใหญ่) หรือ Case Insensitive (ไม่แยก) ได้โดยใช้พารามิเตอร์ Comparer ซึ่งทำให้ยืดหยุ่นมากในการตรวจสอบข้อความ 😎
ส่วนตัวผมใช้ฟังก์ชันนี้บ่อยมากเมื่อต้องการกรองข้อมูลตามคำขึ้นต้น เช่น กรองรหัสสินค้าที่ขึ้นต้นด้วย “PROD-” หรือกรองชื่อลูกค้าที่ขึ้นต้นด้วยอักษรบางตัว โดยมักใช้ร่วมกับ Table.SelectRows เพื่อสร้าง filter condition ที่ซับซ้อน
เลือกเฉพาะรายการสินค้าที่รหัสขึ้นต้นด้วย "PROD" หรือ "SKU"
ถ้าข้อความในคอลัมน์ขึ้นต้นด้วย "Fruits" ให้จัดอยู่ในหมวดหมู่ผลไม้
ข้อความ "Hello World" ขึ้นต้นด้วย "Hello" ตรงทุกตัว (รวมตัวพิมพ์ใหญ่ H) ดังนั้นจึงคืนค่า true
ส่วนตัวผมใช้ example นี้เป็นการตรวจสอบพื้นฐาน เพราะการแยกตัวพิมพ์เล็ก-ใหญ่เป็นจริงใน Power Query
ข้อความ "Hello World" ไม่ได้ขึ้นต้นด้วย "hello" (ตัวพิมพ์เล็ก h) เพราะมันขึ้นต้นด้วย "Hello" (ตัวพิมพ์ใหญ่ H) ดังนั้นคืนค่า false
นี่คือสาเหตุทั่วไปของเหตุการณ์ที่ unexpected ครับ เพราะบางคนลืมว่า Power Query เป็น case-sensitive 😅
ด้วยการใช้ Comparer.OrdinalIgnoreCase ฟังก์ชันจะไม่สนใจความแตกต่างของตัวพิมพ์เล็ก-ใหญ่ ดังนั้น "Apple Pie" ถือว่าขึ้นต้นด้วย "apple" จึงคืนค่า true
ที่ต้องระวังคือ Comparer.OrdinalIgnoreCase จะทำการเปรียบเทียบแบบ ordinal (ตามลำดับไบต์) ไม่ใช่ culturally aware ถ้าต้องการ culture-aware comparison ให้ใช้ Comparer.FromCulture("th-TH") แทน
ตัวอย่างนี้แสดงการใช้ Text.StartsWith ร่วมกับ Table.SelectRows ในสถานการณ์จริง โดยสร้างตาราง Products แล้วกรองเฉพาะสินค้าที่มีรหัส (ProductCode) ขึ้นต้นด้วย "PROD-"
โดยใช้เงื่อนไข each Text.StartsWith([ProductCode], "PROD-") ซึ่ง 'each' วนลูปตรวจสอบทุกแถว และ [ProductCode] คือการอ้างอิงคอลัมน์ ProductCode ในแถวปัจจุบัน
ผลลัพธ์จะได้เฉพาะแถวสินค้า 3 รายการ (PROD-001, PROD-002, PROD-003) ส่วน SERV-001 ถูกกรองออก เพราะมันขึ้นต้นด้วย "SERV-" ไม่ใช่ "PROD-" ส่วนตัวผมชอบใช้ pattern นี้มากครับ เพราะทำให้โค้ด readable และ maintainable ได้ดี 💡
ใช่ครับ เป็น Case Sensitive เมื่อไม่ระบุ Comparer parameter ดังนั้น Text.StartsWith("Apple", "apple") จะคืนค่า false เพราะมันขึ้นต้นด้วย "A" ตัวพิมพ์ใหญ่ ไม่ใช่ "a" ตัวพิมพ์เล็ก
ถ้าต้องการให้ case-insensitive ต้องเพิ่มพารามิเตอร์ที่สามดังนี้ Text.StartsWith("Apple", "apple", Comparer.OrdinalIgnoreCase) หรือสามารถแปลงข้อความก่อนเปรียบเทียบได้เช่น Text.StartsWith(Text.Lower("Apple"), Text.Lower("apple")) ครับ
Text.StartsWith ตรวจสอบเฉพาะว่าข้อความขึ้นต้นด้วยข้อความย่อยที่กำหนดหรือไม่ ส่วน Text.Contains ตรวจสอบว่าข้อความใดจะมีข้อความย่อยนั้นอยู่ที่ไหนก็ได้ (ต้น กลาง ท้าย)
เช่น Text.StartsWith("Hello World", "World") จะคืนค่า false เพราะ "World" ไม่ได้อยู่ที่ต้น แต่ Text.Contains("Hello World", "World") จะคืนค่า true เพราะ "World" อยู่ในข้อความ 😎
ถ้า text parameter (ตัวแรก) เป็น null ฟังก์ชันจะคืนค่า null โดยไม่คืนค่า true หรือ false
ดังนั้นถ้าต้องการตรวจสอบและจัดการกรณี null ต้องเขียนเงื่อนไขพิเศษ เช่น each [Column] null and Text.StartsWith([Column], "Prefix") เพื่อให้แน่ใจว่า [Column] ไม่เป็น null ก่อนทำการเปรียบเทียบ
Comparer.OrdinalIgnoreCase ทำการเปรียบเทียบแบบ ordinal (ตามลำดับไบต์) โดยไม่สนใจตัวพิมพ์เล็ก-ใหญ่ แต่ไม่ได้พิจารณา cultural differences
ส่วน Comparer.FromCulture("th-TH") ทำการเปรียบเทียบแบบ culture-aware ซึ่งอาจให้ผลลัพธ์ต่างกันเมื่อจัดการกับภาษาอื่น เช่น ภาษาไทย ส่วนตัวผมแนะนำให้ใช้ Comparer.OrdinalIgnoreCase สำหรับการเปรียบเทียบทั่วไป และ Comparer.FromCulture เมื่อต้องจัดการข้อมูลที่มีความสำคัญทางวัฒนธรรม 💡
ฟังก์ชันที่ผู้เขียนโยงไว้กับ Text.StartsWith จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
Text.Contains ใช้สำหรับตรวจสอบว่าข้อความที่กำหนด (text) มีข้อความย่อยที่ต้องการค้นหา (substring) อยู่ภายในหรือไม่ ส่งคืนค่า true หรือ false
Text.EndsWith ตรวจสอบว่าข้อความหลักลงท้ายด้วยข้อความย่อย (substring) ที่กำหนดหรือไม่ คืนค่า true หากตรงกัน และ false หากไม่ตรงกัน สามารถใช้ Comparer เพื่อควบคุม Case Sensitivity
หาตำแหน่งของข้อความย่อยในข้อความหลัก (0-indexed) โดยคืนค่า -1 หากไม่พบ
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่