เล่าเรื่อง File ที่ผมเคยใช้
เปลี่ยนมาเล่าเรื่องพื้นฐานกันบ้างนะฮะ
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 มันทำงานได้ดีกว่า เช่น
- YAML สามารถใส่ comment ได้ JSON ทำไม่ได้ ตรงนี้แหละ ที่ผมชอบสุด
- YAML ไม่ใช้วงเล็บ ส่วนตัวเลยรู้สึกเขียนได้ลื่นกว่าฮะ
- YAML สามารถใช้ตัวแปรได้นะ ส่วน JSON ทำไม่ได้
ตัวอย่าง YAML
อ้อ ระวังอย่างนึงนะฮะ YAML เนี่ยจะมี extension เป็น .yaml
ก็ได้ หรือ .yml
ก็ได้ เช็คชื่อและ extension ของ file ดีๆ นะฮะ ไม่งั้นโปรแกรมจะหา file ไม่เจอแหละ ผมพลาดมาบ่อยมาก
ทีนี้ ว่ากันด้วยการเขียน YAML file คือ ทั่วไปเลยผมจะเขียนเอง เพราะมันคือ configuration แต่ใช่ว่าเราจะเขียนด้วยโปรแกรมไม่ได้นะ
นี่คือตัวอย่างการเขียน YAML file ด้วย Python ฮะ
แล้วเราก็อ่านด้วย yaml
เหมือนกัน
ที่ว่ามาทั้งหมด สามารถ pull ได้จาก repo นี้ฮะ
หลักๆ ก็เป็น 5 format ที่ผมใช้เก็บข้อมูลและ configuration นะฮะ อยากรู้ว่าคนอื่นใช้อะไรกันมั่งน้า