Table.TransformColumnNames ใช้ฟังก์ชันแปลงชื่อ (Name Generator) เพื่อเปลี่ยนชื่อคอลัมน์ทั้งหมดในตาราง เหมาะสำหรับจัดรูปแบบชื่อคอลัมน์เป็นแบบเดียวกัน เช่น ตัวพิมพ์ใหญ่ ลบช่องว่าง หรือเพิ่ม Prefix
=Table.TransformColumnNames(table as table, nameGenerator as function, optional options as nullable record) as table
=Table.TransformColumnNames(table as table, nameGenerator as function, optional options as nullable record) as table
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| table | table | Yes | ตารางที่ต้องการแปลงชื่อคอลัมน์ | |
| nameGenerator | function | Yes | ฟังก์ชันที่รับชื่อคอลัมน์เก่า (แทนด้วย _ หรือตัวแปรอื่น) และส่งคืนชื่อใหม่ | |
| options | record | Optional | null | ตัวเลือก (optional) เช่น MaxLength สำหรับจำกัดความยาวชื่อคอลัมน์ หรือ Comparer สำหรับการเปรียบเทียบ |
เพื่อสร้างมาตรฐานชื่อคอลัมน์ที่ชัดเจนและสอดคล้องกัน
เช่น ลบเครื่องหมายวรรคตอน หรือสัญลักษณ์ที่ไม่ต้องการออกจากชื่อคอลัมน์
เช่น เพิ่ม 'Data_' นำหน้าชื่อคอลัมน์ทั้งหมด
let Source = Table.FromRecords({{"firstName", "lastName", "email"}}, {"First Name", "Last Name", "Email"}), Transformed = Table.TransformColumnNames(Source, eac…let
Source = Table.FromRecords({{"firstName", "lastName", "email"}}, {"First Name", "Last Name", "Email"}),
Transformed = Table.TransformColumnNames(Source, each Text.Upper(_))
in
Transformed
[First Name, Last Name, Email] → [FIRST NAME, LAST NAME, EMAIL]
let Source = Table.FromRecords({{1, 2}}, {"First Name", "Last Name"}), Transformed = Table.TransformColumnNames(Source, each Text.Replace(_, " ", "")) in Transf…let
Source = Table.FromRecords({{1, 2}}, {"First Name", "Last Name"}),
Transformed = Table.TransformColumnNames(Source, each Text.Replace(_, " ", ""))
in
Transformed
[First Name, Last Name] → [FirstName, LastName]
let Source = Table.FromRecords({{1, 2}}, {"Amount", "Date"}), Transformed = Table.TransformColumnNames(Source, each "DIM_" & _) in Transformedlet
Source = Table.FromRecords({{1, 2}}, {"Amount", "Date"}),
Transformed = Table.TransformColumnNames(Source, each "DIM_" & _)
in
Transformed
[Amount, Date] → [DIM_Amount, DIM_Date]
let Source = Table.FromRecords({{1, 2}}, {"Order-ID_123", "Customer@Name"}), Transformed = Table.TransformColumnNames(Source, each Text.Replace(Text.Replace(Tex…let
Source = Table.FromRecords({{1, 2}}, {"Order-ID_123", "Customer@Name"}),
Transformed = Table.TransformColumnNames(Source,
each Text.Replace(Text.Replace(Text.Replace(_, "-", ""), "_", ""), "@", ""))
in
Transformed
[Order-ID_123, Customer@Name] → [OrderID123, CustomerName]
Table.TransformColumnNames แปลงชื่อ ‘ทั้งหมด’ ด้วยฟังก์ชัน เหมาะงาน Mass Transformation เช่น ลบช่องว่างหรือแปลงเป็นตัวพิมพ์ใหญ่ทั้งตาราง ส่วน Table.RenameColumns เปลี่ยนชื่อเฉพาะคอลัมน์ที่ระบุชื่อเก่า-ใหม่เท่านั้น ผมแนะนำให้ใช้ TransformColumnNames เวลาต้องจัดรูปแบบเป็นแบบเดียวกัน แต่ RenameColumns ตอนเปลี่ยนชื่อคอลัมน์เฉพาะ 1-2 คอลัมน์
_ คือ ‘ตัวแทน’ (placeholder) สำหรับชื่อคอลัมน์เดิม ตอนเขียน each Text.Upper(_) มันจะเอาชื่อแต่ละคอลัมน์มา Replace ตัว _ แล้วส่งไปให้ Text.Upper ทำงาน ผมเคยนึกว่า _ มีความหมายตรงนั้นไม่ได้ เลยสับสนสำหรับตอนแรก 😅 แต่พอเข้าใจแล้ว มันก็ง่ายมาก
ถ้าชื่อซ้ำกันแล้ว Power Query จะโยน Error เพราะคอลัมน์ต้องมีชื่อไม่ซ้ำกัน ถ้าให้ชื่อเหมือนเดิม มันก็จะผ่านนะ (ไม่มีการเปลี่ยนแปลง) ผมแนะนำให้เทสด้วย Table.ColumnNames(Source) ก่อน เพื่อดูว่าชื่อใหม่จะออกมาแบบไหน
ได้สิครับ! เช่น each Text.Upper(Text.Trim(Text.Replace(_, ” “, “_”))) ก็ได้ แต่ถ้ามันเยอะเกินไป ผมแนะนำให้เขียน Custom Function ทำไว้ก่อน แล้วใช้ function นั้นใน nameGenerator แทน จะดูสะอาดและ Maintainable ขึ้นเยอะ
Table.TransformColumnNames คือฟังก์ชันจัดรูปแบบชื่อคอลัมน์ที่ใช้ฟังก์ชัน nameGenerator เพื่อแปลงชื่อแต่ละชื่อ ซึ่งแตกต่างจาก Table.RenameColumns ตรงที่มันแปลงชื่อ ‘ทั้งหมด’ โดยใช้ฟังก์ชัน เหมาะกับการจัดรูปแบบแบบเป็นไปทั่วทั้งตาราง
ที่เจ๋งคือสามารถใช้ฟังก์ชันใดก็ได้ตราบเท่าที่รับชื่อเดิมและส่งคืนชื่อใหม่ เช่น Text.Upper, Text.Lower, Text.Replace, หรือแม้แต่ฟังก์ชันที่สร้างเอง ทำให้มีความยืดหยุ่นสูง
ส่วนตัวผมใช้บ่อยมากเวลาข้อมูลเข้ามาจากหลายแหล่ง (API, CSV, Excel) ที่ชื่อคอลัมน์ไม่สม่ำเสมอ – บางที่เป็น UPPERCASE บางที่ mIxEdCasE บางที่มีช่องว่าง ประมาณนี้ต้องใช้ Table.TransformColumnNames เลย 😎