Table.FromRows สร้างตารางจาก List ของ List โดยแต่ละ List ย่อยแทนข้อมูลในแถวหนึ่ง คล้ายกับการ transpose ข้อมูลแบบแถว-คอลัมน์ แต่ทำให้เป็นตารางจริงในทันที
=Table.FromRows(rows as list, optional columns as any) as table
=Table.FromRows(rows as list, optional columns as any) as table
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| rows | List of Lists | Yes | รายการแถวข้อมูล โดยแต่ละแถวเป็น List ของค่าต่างๆ เช่น {{1, “A”}, {2, “B”}} หรือ {{1, “Alice”, true}, {2, “Bob”, false}} | |
| columns | List of Text, Table Type, หรือ Number | Optional | null – ตั้งชื่ออัตโนมัติเป็น Column1, Column2, … ตามลำดับ | สามารถเป็น List ของชื่อคอลัมน์ (เช่น {“ID”, “Name”, “Sales”}) หรือ Table Type ที่ระบุชื่อและชนิดข้อมูล (เช่น type table [ID = number, Name = text]) หรือตัวเลขแทนจำนวนคอลัมน์ |
let Rows = { {1, "Bob", 100}, {2, "Jim", 200}, {3, "Alice", 150} }, Result = Table.FromRows(Rows, {"ID", "Name", "Sales"}) in Resultlet
Rows = {
{1, "Bob", 100},
{2, "Jim", 200},
{3, "Alice", 150}
},
Result = Table.FromRows(Rows, {"ID", "Name", "Sales"})
in
Result
ตารางมี 3 แถว 3 คอลัมน์ (ID, Name, Sales) โดยแต่ละแถวแสดงข้อมูลพนักงานและยอดขาย
let Rows = { {"Apple", 5}, {"Banana", 3}, {"Orange", 8} }, Result = Table.FromRows(Rows) in Resultlet
Rows = {
{"Apple", 5},
{"Banana", 3},
{"Orange", 8}
},
Result = Table.FromRows(Rows)
in
Result
ตารางมี 3 แถว 2 คอลัมน์ โดยคอลัมน์ชื่อ Column1 และ Column2 ตามลำดับ
let Rows = { {1, "Alice", true}, {2, "Bob", false}, {3, "Charlie", true} }, ColumnType = type table [UserID = number, Name = text, IsActive = logical], Result =…let
Rows = {
{1, "Alice", true},
{2, "Bob", false},
{3, "Charlie", true}
},
ColumnType = type table [UserID = number, Name = text, IsActive = logical],
Result = Table.FromRows(Rows, ColumnType)
in
Result
ตารางมี 3 แถว 3 คอลัมน์ โดยแต่ละคอลัมน์มีชนิดข้อมูลที่กำหนดไว้อย่างชัดเจน (number, text, logical)
let JsonData = Json.Document( "{\"data\": [[1, \"John\", 2500], [2, \"Jane\", 3000]]}" ), DataList = JsonData[data], Result = Table.FromRows( DataList, {"Employ…let
JsonData = Json.Document(
"{\"data\": [[1, \"John\", 2500], [2, \"Jane\", 3000]]}"
),
DataList = JsonData[data],
Result = Table.FromRows(
DataList,
{"EmployeeID", "Name", "Salary"}
)
in
Result
ตารางมี 2 แถว 3 คอลัมน์ โดยข้อมูลมาจาก JSON structure และได้ชื่อคอลัมน์ที่เหมาะสม
ปัญหานี้เจอบ่อยมากครับ 😅 Table.FromRecords ต้องการข้อมูลเป็น List ของ Record เช่น {[ID=1, Name=”Bob”], [ID=2, Name=”Jim”]} ส่วน Table.FromRows ต้องการเป็น List ของ List เช่น {{1, “Bob”}, {2, “Jim”}} ถ้าคุณมี nested list แต่ต้องการ Record ให้ใช้ Table.FromRecords แทน แต่ถ้าข้อมูลมาเป็น List of Lists ให้ใช้ Table.FromRows โดยตรง ผมแนะนำให้ตรวจเช็คโครงสร้างข้อมูลต้นฉบับก่อน เพื่อเลือกใช้ฟังก์ชันที่เหมาะสม
ไม่จำเป็นครับ หากไม่ระบุ Power Query จะตั้งชื่ออัตโนมัติเป็น Column1, Column2, … แต่ผมแนะนำให้ระบุเสมอถ้าเป็นไปได้ เพราะชื่อที่มีความหมายจะช่วยให้เข้าใจข้อมูลได้ง่ายขึ้น และเมื่อต้องอ้างอิงคอลัมน์ในขั้นตอนถัดไป ชื่อที่ชัดเจนจะลดความสับสน
คำถามเจ๋งครับ! ถ้าโครงสร้าง JSON ไม่แน่นอน คุณสามารถสร้าง function ที่ตรวจสอบและปรับขนาด columns parameter แบบไดนามิก โดยใช้ List.Transform และ List.Range เพื่อกำหนดจำนวนคอลัมน์จากแถวแรก อีกวิธีหนึ่งคือปล่อยให้ Power Query ตั้งชื่ออัตโนมัติก่อน แล้วใช้ Table.RenameColumns หลังจากนั้น
ใช้ได้ครับ แต่ประสิทธิภาพขึ้นอยู่กับขนาดข้อมูล ผมแนะนำให้ตรวจสอบกับข้อมูลจริง บางครั้งถ้าข้อมูลมีขนาดใหญ่มาก อาจต้องใช้การ stream หรือ batch processing แทน แต่สำหรับข้อมูลทั่วไป (นับแสน record) Table.FromRows ก็ใช้ได้ปกติดีครับ
Table.FromRows(rows, columns) ใช้สร้างตารางจากข้อมูลที่มีโครงสร้างแบบ nested list โดยจะแปลงแต่ละ list ย่อยให้เป็นแถวหนึ่งของตาราง เหมาะมากสำหรับข้อมูลจาก API หรือแหล่งภายนอกที่มาในรูปแบบ {{val1, val2}, {val3, val4}} แล้วต้องการแปลงเป็นตารางสำหรับการวิเคราะห์ต่อ
ที่เจ๋งคือสามารถระบุชื่อคอลัมน์ได้อย่างชัดเจน หรือแม้แต่ระบุ Type definition เพื่อให้ Power Query เข้าใจชนิดข้อมูลแต่ละคอลัมน์ตั้งแต่ต้น ต่างจาก Table.FromRecords ที่ต้องการ List ของ Record แบบ [ID=1, Name=”Bob”]
ส่วนตัวผมใช้ Table.FromRows คู่กับ List.Transform บ่อยมากเมื่อต้องสร้างตารางแบบไดนามิก โดยเฉพาะตอนทำงานกับข้อมูลจากเว็บเซอร์วิส JSON ที่ได้มาเป็น nested array ก่อน แล้วใช้ Table.FromRows เพื่อแปลงให้เป็นตารางสะอาดๆ ผ่านครั้งเดียว โค้ดจึงอ่านง่ายขึ้นเยอะครับ