เปลี่ยนมาเล่าเรื่องพื้นฐานกันบ้างนะฮะ

File เนี่ยเป็นอะไรที่เราชาวโปรแกรมเมอร์ใช้กันอยู่ตลอดเวลา เป็นเบสิคของเบสิค เพราะมันคือกลุ่มก้อนข้อมูลที่เราเก็บเอาไว้ใน local storage ก็ดี หรือจะเป็น cloud storage ก็ดี

ทีนี้ ผมเลยจะเล่าว่าตลอดเวลาที่เขียนโปรแกรมมา ผมใช้ File หลักๆ เป็นแบบไหนบ้าง แล้วเราจะสามารถเขียนให้มันอ่านและเขียนได้อย่างไรนะฮะ

เริ่มกันเลย


CSV

CSV ย่อมาจาก "Comma-Separated Values" (wiki) ซึ่งเจ้านี่เป็นตัวนึงที่ผมมั่นใจว่าทุกคนที่เขียนโปรแกรม หรือทำงานเกี่ยวกับการวิเคราะห์ข้อมูลจะต้องเคยเจอ เคยสัมผัสมันมาแล้ว

ลักษณะของ CSV ก็แบบข้อมูลตรงไปตรงมา แต่กลับมีความยุ่งยากอยู่ข้างในเหมือนกันนะ นั่นคือ

  • บรรทัดแรกเป็นหัวเรื่อง (header) แต่บางทีก็ไม่มี
  • ใช้ comma (,) คั่นระหว่างค่า แต่บางทีก็ใช้ pipe (|) ไม่ก็ semi-colon (;)
  • ทุกบรรทัด จะต้องมีจำนวนข้อมูลเท่ากันเป๊ะๆ รวมถึงบรรทัดแรกที่เป็นหัวเรื่องด้วย ไม่งั้นจะฟ้องว่า บรรทัดนี้ไม่เหมือนชาวบ้าน โปรแกรมอ่านไม่ได้
  • ถ้าข้อมูลไหนเป็นค่าที่มีตัวคั่นอยู่ข้างใน จะต้องครอบ (encapsulation) ด้วย double-quotes "" ไม่งั้นจะโดนฟ้องว่า บรรทัดนี้ไม่เหมือนชาวบ้าน โปรแกรมอ่านไม่ได้

อืม ดูมีอะไรจริงๆ ด้วยแหละ เราก็ต้องระวังตรงพวกนี้ให้ดีนะฮะ ไม่งั้นจะเกิดปัญหากันได้

ทีนี้ มาดูตัวอย่าง File CSV กัน

เวลาผมจะเปิดมันมาเช็ค ผมนิยมใช้ และแนะนำให้เพื่อนใช้ extensionของ VSCode ตัวนี้ฮะ  Rainbow CSV มันสามารถแสดงผลเป็น column ให้อ่านได้ง่ายๆ เลยแหละ ลดความเสี่ยงตาลายตอนไล่อ่านค่านานๆ

ตัว Rainbow CSV มี function ประมาณนี้ให้ ตอนเราเปิดจาก Palette ของ VSCode นะฮะ

แล้วเราก็ใช้ "Align CSV Column"...

จากหน้าตานี่

มาจัดสวยๆ แบบนี่

เปิดดู file ได้แล้ว ทีนี้ตอนเราจะเขียน file ด้วย Python สมมติว่าเรามีตัวแปร dict อยู่ตัวนึง ต้องการเขียนค่าลง CSV file วิธีง่ายที่สุดที่ผมชอบใช้ คือ module csv ฮะ

แล้วพอจะอ่าน ส่วนตัวผมใช้ module pandas แหละ


JSON

มาต่อกันที่ JSON ซึ่งย่อมาจาก "Javascript Object Notation" (json.org) อันนี้ก็เป็นที่นิยมมากเหมือนกัน เราใช้ format นี้เก็บข้อมูลได้ดีมาก ด้วยลักษณะของมันที่เก็บเป็น key-value pair แล้วประกอบกันเป็นกลุ่มๆ แต่ละกลุ่มสามารถเป็น value ของกลุ่มใหญ่กว่าได้

หน้าตาประมาณนี้นะฮะ คิดว่าเกือบทุกคนจะเคยผ่านมันมาหมดแล้วแหละ

ทีนี้ ถ้าเราจะเขียน dict object ลงไปเป็น JSON file ก็ใช้ JSON module ประมาณนี้ฮะ

พอจะอ่าน เราสามารถเลือกได้ว่าจะใช้json หรือจะเป็น pandas ได้ทั้งคู่เลย


JSONL

JSONL เป็น JSON นั่นแหละ แต่เป็นอีก version แยกออกมา มันย่อมาจาก "JSON Lines" ตัวนี้เราสามารถใช้ใน integration กับ BigQuery ได้นะฮะ

ข้อแตกต่างชัดเจนระหว่าง JSON กับ JSONL คือ JSONL เป็น JSON object ในแต่ละบรรทัดนั่นเองฮะ แล้วแต่ละบรรทัดก็คือแต่ละ transaction ในรูปของ JSON payload ซึ่งสามารถใช้ร่วมกับ OLAP (Online Analytical Processing) databases เช่น BigQuery ได้นั่นเองฮะ

รายละเอียดปลีกย่อย สามารถไปค้นต่อได้ที่ https://jsonlines.org นะฮะ

เอาล่ะ เข้าประเด็นกันว่าถ้าเราจะเขียน JSONL สามารถทำได้ประมาณนี้เลย

ส่วนการอ่าน ก็ใช้แบบเดียวกับ JSON file นั่นคือ json ก็ได้ หรือ pandas ก็ได้เหมือนกัน


Parquet

บางคนอาจจะเคยใช้มาแล้ว Parquet เป็น format ที่คิดค้นจาก Apache (Apache Parquet) ส่วนตัวผมเนี่ยไม่ค่อยได้ใช้เท่าไหร่หรอก แต่มันดีตรงที่มันสามารถเก็บและย่อ file ใหญ่ๆ ให้เล็กลงได้มากกว่าเมื่อเทียบกับ file format อื่น

ดูจากรูปนี้ก็ได้ฮะ

เมื่อเรามีข้อมูลเหมือนกันเลยนะ Parquet file สามารถเก็บได้ในขนาดแค่ 4 MB ในขณะที่  CSV มีขนาดถึง 21 MB และ JSON ใหญ่เบิ้มเลยที่ 59 MB

Parquet เก็บข้อมูลเป็นส่วนๆ กัน เวลาเราอ่าน จะได้ประมาณตัวอย่างนี้ฮะ

Parquet เนี่ย เราไม่สามารถอ่านได้ตรงๆ จาก text editor ทั่วไป เพราะมันไม่ได้เก็บเป็น text ดังนั้น ถ้าเราอยากจะอ่านเนื้อหาข้างในก็ควรจะเปิดด้วยโปรแกรมเฉพาะ หรือวิธีที่ผมถนัดก็คือ Python หรือ programming languages อื่นฮะ

ทีนี้ เรามาดูวิธีเขียน Parquet file ทำได้แบบนี้

และก็อ่านเนื้อหาด้วย module เดียวกันได้เลยฮะ


YAML

และสุดท้าย YAML มันย่อมาจาก "Yet Another Markup Language" (wiki) ผมไม่ได้ใช้ YAML เก็บข้อมูลนะฮะ ผมเอาไว้เก็บพวก configuration มากกว่า

ด้วยโครงสร้างแบบ key-value pair แบบ JSON บางคนก็นิยมใช้ JSON เก็บ configuration เหมือนกันนะ แต่ว่า YAML มันทำงานได้ดีกว่า เช่น

  1. YAML สามารถใส่ comment ได้ JSON ทำไม่ได้ ตรงนี้แหละ ที่ผมชอบสุด
  2. YAML ไม่ใช้วงเล็บ ส่วนตัวเลยรู้สึกเขียนได้ลื่นกว่าฮะ
  3. YAML สามารถใช้ตัวแปรได้นะ ส่วน JSON ทำไม่ได้

ตัวอย่าง YAML

อ้อ ระวังอย่างนึงนะฮะ YAML เนี่ยจะมี extension เป็น .yaml ก็ได้ หรือ .yml ก็ได้ เช็คชื่อและ extension ของ file ดีๆ นะฮะ ไม่งั้นโปรแกรมจะหา file ไม่เจอแหละ ผมพลาดมาบ่อยมาก

ทีนี้ ว่ากันด้วยการเขียน YAML file คือ ทั่วไปเลยผมจะเขียนเอง เพราะมันคือ configuration แต่ใช่ว่าเราจะเขียนด้วยโปรแกรมไม่ได้นะ

นี่คือตัวอย่างการเขียน YAML file ด้วย Python ฮะ

แล้วเราก็อ่านด้วย yaml เหมือนกัน


ที่ว่ามาทั้งหมด สามารถ pull ได้จาก repo นี้ฮะ

GitHub - bluebirz/file-formats: Collection of file formats I have worked with
Collection of file formats I have worked with. Contribute to bluebirz/file-formats development by creating an account on GitHub.

หลักๆ ก็เป็น 5 format ที่ผมใช้เก็บข้อมูลและ configuration นะฮะ อยากรู้ว่าคนอื่นใช้อะไรกันมั่งน้า