Folder.Contents เป็น function สำหรับดึงรายการไฟล์และโฟลเดอร์ทั้งหมดที่อยู่ใน folder path ที่กำหนดไว้ โดยจะคืนค่าเป็น table ที่มีข้อมูล metadata ครบถ้วน เช่น ชื่อไฟล์ วันที่สร้างและแก้ไข ขนาดไฟล์ และ binary content link สำหรับเข้าถึงเนื้อหาภายในไฟล์ เหมาะสำหรับงานที่ต้องการ import ข้อมูลจากหลายไฟล์พร้อมกันในโฟลเดอร์เดียว หรือการวิเคราะห์โครงสร้างไฟล์และคุณสมบัติต่างๆ ก่อนตัดสินใจนำเข้าข้อมูล
| อาร์กิวเมนต์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
| path | text | folder path ที่ต้องการดึงรายการไฟล์และโฟลเดอร์ ต้องเป็น absolute path เช่น “C:\\Data\\Files” (Windows) หรือ “/Users/Data/Files” (Mac/Linux) | |
| [options]ไม่บังคับ | nullable record | null | record parameter สำหรับ internal use ไม่แนะนำให้ใช้งานทั่วไป ปล่อยว่างได้ |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
Folder.Contents เป็น M function ที่ใช้สำหรับดึงรายการไฟล์และโฟลเดอร์ทั้งหมดที่อยู่ภายใน folder path ที่ระบุ โดยจะคืนค่าเป็น table ที่มีทั้งข้อมูล metadata (ชื่อไฟล์ วันที่แก้ไข ขนาด ฯลฯ) และ link สำหรับเข้าถึง content ของแต่ละไฟล์
.
ฟังก์ชันนี้มีประโยชน์อย่างมากเมื่อต้องการ import ข้อมูลจากหลายไฟล์ในโฟลเดอร์เดียวกัน หรือต้องการวิเคราะห์ file structure และ attributes ของไฟล์ต่างๆ ก่อนนำเข้าข้อมูล
ความแตกต่างระหว่าง Folder.Contents และ Folder.Files คือ Folder.Contents จะคืนค่าทั้ง ไฟล์และโฟลเดอร์ ที่อยู่ใน path ระดับเดียว (ไม่รวม subfolder) ในขณะที่ Folder.Files จะคืนค่าเฉพาะ ไฟล์เท่านั้น และจะค้นหาใน subfolder ทั้งหมดด้วย
.
การใช้ Folder.Contents จึงเหมาะกับการควบคุม folder structure ได้แม่นยำกว่า และสามารถนำไปใช้กับ Table.SelectRows เพื่อ filter เฉพาะไฟล์หรือโฟลเดอร์ที่ต้องการได้
ใช้ Folder.Contents ดึงรายการไฟล์ทั้งหมด แล้ว filter เฉพาะไฟล์ .xlsx ก่อนรวมข้อมูล
ใช้ Folder.Contents ตรวจสอบวันที่แก้ไข ขนาดไฟล์ หรือชื่อไฟล์ เพื่อกรองเฉพาะไฟล์ที่ต้องการนำเข้า
ใช้ Folder.Contents ดึงข้อมูล metadata ของไฟล์ทั้งหมดใน folder เพื่อสร้างรายงานการจัดการไฟล์
Folder.Contents คืนค่า table ที่มีรายการทั้งหมดใน folder โดย column Name แสดงชื่อไฟล์/โฟลเดอร์ Extension แสดงนามสกุลไฟล์ (folder จะเป็นค่าว่าง) Date modified แสดงวันที่แก้ไขล่าสุด และ Content เป็น binary link สำหรับเข้าถึงข้อมูลภายในไฟล์
ใน Power Query Editor จะเห็นแต่ละ row แสดงรายละเอียดของไฟล์/โฟลเดอร์แยกกัน
หลังจากใช้ Folder.Contents ดึงรายการทั้งหมดแล้ว เราใช้ Table.SelectRows กับ each keyword เพื่อ filter เฉพาะ row ที่มี Extension column = ".xlsx"
เทคนิคนี้มีประโยชน์เมื่อมีไฟล์หลายประเภทใน folder เดียวกัน และต้องการ import เฉพาะ Excel files เท่านั้น สามารถเปลี่ยน condition เป็น [Extension] = ".csv" หรือ Text.Contains([Name], "Sales") เพื่อ filter ตามเงื่อนไขอื่นได้ครับ
ตัวอย่างนี้แสดงการใช้ Folder.Contents ร่วมกับ Date functions เพื่อ filter ไฟล์ตามวันที่ โดย DateTime.LocalNow() ดึงวันเวลาปัจจุบัน Date.AddDays(…, -7) คำนวณย้อนหลัง 7 วัน จากนั้นใช้ each [Date modified] >= SevenDaysAgo กรองเฉพาะไฟล์ที่แก้ไขใหม่กว่า 7 วัน
และ [Extension] <> "" ใช้ filter โฟลเดอร์ออก (เพราะโฟลเดอร์มี Extension เป็นค่าว่าง) เหมาะกับการ import เฉพาะไฟล์ใหม่ๆ ครับ
ตัวอย่างขั้นสูงนี้แสดงวิธีรวมข้อมูลจากหลายไฟล์ Excel โดย Folder.Contents ดึงรายการไฟล์ทั้งหมด Table.SelectRows filter เฉพาะ .xlsx Table.AddColumn สร้าง column ใหม่ชื่อ "Data" ที่เก็บผลลัพธ์จาก Excel.Workbook([Content]) ซึ่งอ่านข้อมูลจาก binary content ของแต่ละไฟล์
จากนั้นใช้ Table.ExpandTableColumn ขยาย nested tables ออกมา filter เฉพาะ sheet ชื่อ "Sales" และขยาย columns ที่ต้องการ (Product, Amount) สุดท้าย Table.SelectColumns เลือกเฉพาะ columns ที่จำเป็น
เทคนิคนี้ใช้บ่อยมากในการรวมไฟล์รายเดือนหรือรายสาขา ส่วนตัวผมใช้วิธีนี้ตลอดเลยครับ 😎
เทคนิคง่ายๆ ในการแยกไฟล์กับโฟลเดอร์ คือการตรวจสอบ Extension column โดยไฟล์จะมีค่า Extension (เช่น ".xlsx", ".csv", ".txt") แต่โฟลเดอร์จะมีค่าว่าง ("")
ดังนั้น [Extension] <> "" จะ filter เฉพาะไฟล์ ส่วน [Extension] = "" จะ filter เฉพาะโฟลเดอร์ หรือสามารถใช้ Record.HasFields([Attributes], "Directory") ตรวจสอบจาก Attributes column ก็ได้ แต่การใช้ Extension นั้นง่ายกว่าและอ่านโค้ดเข้าใจง่ายกว่าครับ
Folder.Contents คืนค่าทั้งไฟล์และโฟลเดอร์ในระดับเดียว (ไม่ลงไปใน subfolder) เหมาะกับการควบคุม folder structure ได้แม่นยำ
ส่วน Folder.Files คืนค่าเฉพาะไฟล์เท่านั้นและค้นหาลงไปใน subfolder ทั้งหมดอัตโนมัติ เหมาะกับการ import ไฟล์ทั้งหมดใน folder tree โดยไม่สนใจ structure ครับ
วิธีที่ง่ายที่สุดคือใช้ Extension column โดยไฟล์จะมีค่า Extension (เช่น ".xlsx") แต่โฟลเดอร์จะมีค่าว่าง ใช้ Table.SelectRows(…, each [Extension] "") เพื่อ filter เฉพาะไฟล์ หรือ each [Extension] = "" เพื่อ filter เฉพาะโฟลเดอร์
Content column เป็น binary link ที่ชี้ไปยังเนื้อหาภายในไฟล์ สามารถนำไปใช้กับ functions อื่นๆ เช่น Excel.Workbook([Content]) เพื่ออ่านไฟล์ Excel, Csv.Document([Content]) สำหรับ CSV หรือ Json.Document([Content]) สำหรับ JSON
สะดวกมากครับ ไม่ต้องระบุ path ซ้ำอีก 😎
options parameter เป็น nullable record ที่ Microsoft จองไว้สำหรับ internal use ในอนาคตหรือการใช้งานพิเศษเฉพาะ ผู้ใช้ทั่วไปไม่จำเป็นต้องส่งค่านี้ และควรปล่อยให้เป็น null (ค่า default) ไป Microsoft ไม่ได้ document การใช้งาน options นี้ใน official documentation
ไม่แนะนำครับ เพราะ Power Query ต้องการ absolute path เสมอเพื่อความชัดเจนและป้องกันข้อผิดพลาด ควรใช้ full path เช่น "C:\\Data\\Files" (Windows) หรือ "/Users/Data/Files" (Mac/Linux)
หากต้องการความยืดหยุ่น สามารถใช้ parameter ใน Power Query เพื่อกำหนด path แบบ dynamic ได้ครับ
ใช้ Table.SelectRows ร่วมกับ each keyword เช่น each Text.Contains([Name], "Sales") สำหรับ filter ตามชื่อ หรือ each Date.From([Date modified]) >= #date(2024,1,1) สำหรับ filter ตามวันที่ สามารถใช้ logical operators (and, or) รวมหลายเงื่อนไขได้
รองรับครับ สามารถใช้ UNC path เช่น "\\\\Server\\Share\\Folder" หรือ mapped network drive เช่น "Z:\\Data" ได้ตามปกติ
แต่ต้องแน่ใจว่า Power Query service (Desktop หรือ Service) มีสิทธิ์เข้าถึง network location นั้นได้นะครับ ไม่งั้นจะ error ทันที 😅
ฟังก์ชันที่ผู้เขียนโยงไว้กับ Folder.Contents จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
Excel.Workbook อ่าน binary content ของไฟล์ Excel แล้วคืนค่าเป็น table ที่แต่ละ row แทนด้วย worksheet, named range หรือ Excel table โดยมี columns คือ Item (ชื่อ), Kind (ประเภท), Name (ชื่อเต็ม), Data (nested table ของข้อมูลจริง), และ Hidden (boolean) รองรับ useHeaders และ delayTypes เป็น parameters แต่ Microsoft แนะนำให้ใช้ Table.PromoteHeaders แทนเพื่อหลีกเลี่ยงปัญหา culture conversion นอกจากนี้ยังมี InferSheetDimensions option สำหรับแก้ปัญหา metadata ที่ผิดพลาด ใช้ร่วมกับ File.Contents หรือ Web.Contents สำหรับโหลดไฟล์
File.Contents ใช้อ่านข้อมูล binary ของไฟล์จากพาธที่ระบุ เพื่อนำเข้าข้อมูลจากระบบไฟล์ลงในโปรแกรม
Folder.Files ใช้สำหรับอ่านรายชื่อไฟล์ทั้งหมดในโฟลเดอร์ที่กำหนด รวมถึงโฟลเดอร์ย่อยด้วย คืนค่าเป็น table ที่มีข้อมูลไฟล์เช่น ชื่อ วันที่สร้าง ขนาด และลิงก์เข้าถึงไฟล์
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่