Enumeration ที่ใช้กำหนดว่าองค์ประกอบของ Binary Format ควรปรากฏกี่ครั้ง ช่วยให้ Power Query เข้าใจโครงสร้างข้อมูลสตรีมไบนารี
=BinaryOccurrence.Optional | BinaryOccurrence.Required | BinaryOccurrence.Repeating
=BinaryOccurrence.Optional | BinaryOccurrence.Required | BinaryOccurrence.Repeating
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| BinaryOccurrence.Optional | number (0) | Optional | รายการนี้มีได้ 0 หรือ 1 ครั้ง ใช้เวลารายการไม่บังคับต้องมี | |
| BinaryOccurrence.Required | number (1) | Optional | รายการนี้ต้องมี 1 ครั้งพอดี ใช้เมื่อข้อมูลอบรม ต้องมีแน่นอน | |
| BinaryOccurrence.Repeating | number (2) | Optional | รายการนี้มีได้ 0 ครั้งหรือมากกว่า ใช้เมื่อมีหลายรายการที่เหมือนกันต่อเนื่องกัน |
let BinaryData = File.Contents("C:\\data.bin"), Format = BinaryFormat.Record([ [Header, BinaryFormat.Text(4), BinaryOccurrence.Required], [Count, BinaryFormat.B…let
BinaryData = File.Contents("C:\\data.bin"),
Format = BinaryFormat.Record([
[Header, BinaryFormat.Text(4), BinaryOccurrence.Required],
[Count, BinaryFormat.Byte, BinaryOccurrence.Required],
[Data, BinaryFormat.List(BinaryFormat.Byte), BinaryOccurrence.Repeating]
]),
Result = Binary.View(BinaryData, Format)
in
Result
[Header = "TEST", Count = 10, Data = {1, 2, 3, ...}]
let Format = BinaryFormat.Record([ [ID, BinaryFormat.Byte, BinaryOccurrence.Required], [Signature, BinaryFormat.Text(3), BinaryOccurrence.Optional], [Value, Bin…let
Format = BinaryFormat.Record([
[ID, BinaryFormat.Byte, BinaryOccurrence.Required],
[Signature, BinaryFormat.Text(3), BinaryOccurrence.Optional],
[Value, BinaryFormat.Byte, BinaryOccurrence.Required]
])
in
Format
BinaryFormat.Record structure with optional Signature field
let Format = BinaryFormat.Record([ [Version, BinaryFormat.Byte, BinaryOccurrence.Required], [Items, BinaryFormat.List(BinaryFormat.Byte), BinaryOccurrence.Repea…let
Format = BinaryFormat.Record([
[Version, BinaryFormat.Byte, BinaryOccurrence.Required],
[Items, BinaryFormat.List(BinaryFormat.Byte), BinaryOccurrence.Repeating],
[Footer, BinaryFormat.Text(2), BinaryOccurrence.Optional]
])
in
Format
Binary format with repeating items and optional footer
BinaryFormat.Record([ [Header, BinaryFormat.Text(10), BinaryOccurrence.Required], [Comment, BinaryFormat.Text(50), BinaryOccurrence.Optional], [Records, BinaryF…=BinaryFormat.Record([
[Header, BinaryFormat.Text(10), BinaryOccurrence.Required],
[Comment, BinaryFormat.Text(50), BinaryOccurrence.Optional],
[Records, BinaryFormat.Record([...]), BinaryOccurrence.Repeating]
])
Binary format specification
ผมอธิบายว่า Optional หมายถึง 0 หรือ 1 ครั้งเท่านั้น ส่วน Repeating หมายถึง 0 ครั้งขึ้นไป ถ้าเราต้องการให้มี 2 รายการขึ้นไป ต้องใช้ Repeating
ผมพบว่า ถ้าไม่ระบุรูปแบบการปรากฏตัว Power Query อาจอ่านข้อมูลไม่ถูกต้อง หรืออาจติดขัดตอนมี Optional field ที่ไม่มี ดังนั้นการระบุให้ชัดเจนจะช่วยประหยัดเวลาแก้ไข
ผมได้ลองตรวจสอบ และเท่าที่ทราบแล้ว BinaryOccurrence.Type มีแค่สามค่า: Optional, Required, และ Repeating เท่านั้น
BinaryOccurrence.Type เป็น Enumeration ในม Power Query ที่ใช้ระบุกฎการปรากฏตัวของรายการเมื่ออ่านข้อมูล Binary Format ครับ มีค่าได้สามแบบ: Optional (0-1 ครั้ง), Required (ต้องมี 1 ครั้ง), หรือ Repeating (0 ครั้งขึ้นไป)
ที่เจ๋งคือ ด้วยการระบุรูปแบบการปรากฏตัวนี้ Power Query จะสามารถอ่านไฟล์ Binary ได้อย่างถูกต้อง โดยไม่ต้องคำนวณตำแหน่งไบต์เอง
ส่วนตัวผม ใช้ BinaryOccurrence.Type บ่อยครั้งตอนอ่านไฟล์ที่มี Header ตรงกันข้ามกับ Repeating Sections ของข้อมูล ทำให้รู้ว่าจะต้องตั้งค่าแต่ละส่วนอย่างไร 😎