4. การอ่านและบันทึกข้อมูลลงไฟล์ .mat .txt .xslx .csv
การเขียนโปรแกรมสำหรับใช้งานจริงนั้น สิ่งที่ขาดไม่ได้เลยคือ การอ่านและเขียนข้อมูลลงไฟล์ เพราะว่า ข้อมูล input ของโปรแกรมของเรา ส่วนมากจะมาจากที่อื่นๆ เช่น มาจากชุด sensor ต่างๆ และเมื่อโปรแกรมของเราทำการคำนวณเสร็จแล้ว ก็ต้องบันทึกผลการคำนวณไว้ เพื่อเรียกใช้ครั้งต่อไป หรือเพื่อให้คนอื่นนำข้อมูลนี้ไปใช้ต่อได้ ซึ่งในหัวข้อนี้เราจะเรียนการบันทึกข้อมูลและการอ่านข้อมูลลงไฟล์ 4 ประเภทด้วยกันคือ .mat, .txt, .xlsx, .csv
รูปแบบของคำสั่ง save คือ
จากตัวอย่างจะเห็นว่าทั้งชื่อไฟล์ และชื่อตัวแปร จะต้องเขียนในเครื่องหมาย ‘ - ’ เสมอ และไม่ว่าเราจะกำหนดนามสกุลเป็น .mat หรือไม่ ไฟล์ที่เราเซฟก็จะเป็น .mat เสมอ
1. ใช้คำสั่ง load(filename)
เมื่อใช้คำสั่งนี้ ค่าตัวแปรที่อยู่ในไฟล์ .mat จะถูกโหลดมาไว้ใน workspace ซึ่งจะสังเกตุเห็นว่ามันมีชื่อเดียวกันกับตัวแปรที่เราบันทึกลงไฟล์ .mat เลย และเพราะเหตุนี้ วิธีนี้จึงมีข้อเสียคือ
A) ไม่ว่าเราจะ load โดยมีตัวแปรมารับค่าหรือไม่ ข้อมูลก็จะยังอยู่ในตัวแปรชื่อเดิมที่เราบันทึกเสมอ และหากว่าเราเอาตัวแปรมารับค่า ก็จะกลายเป็น struct ที่ซ้อนอยู่ใน struct อีกที ทำให้การเข้าถึงข้อมูลยุ่งยากขึ้นไปอีก
B) เมื่อเราใช้คำสั่งนี้ เราจะไม่เห็นว่าตัวแปรอะไร ถูกโหลดขึ้นมา เราต้องมาหาเองว่ามีตัวแปรอะไรที่เพิ่มขึ้นมาใน workspace หรือไม่ก็ต้องมาพิมพ์โค้ดทดสอบใน command window เพื่อดูว่าการโหลดไฟล์นั้นเข้ามา เราจะได้ตัวแปรชื่อว่าอะไรบ้าง ซึ่งเป็นเรื่องที่ไม่สะดวกเลยในการเขียนโปรแกรม
C) ไม่ใช่ว่าโปรแกรมทุกประเภท จะอ่าน และเขียนข้อมูลลง workspace เสมอ ซึ่งโปรแกรมรูปแบบที่ว่านั้นก็คือ ฟังก์ชัน และในการเขียนโปรแกรมเพื่อใช้งานจริงๆ เราก็มักจะเขียนไว้ในรูปฟังก์ชันด้วย ดังนั้นคำสั่ง load จึงไม่เหมาะสม
คำสั่งนี้ใช้นำเข้าข้อมูลจากไฟล์ได้หลายประเภท และหนึ่งในนั้นคือไฟล์ .mat ซึ่งมีข้อดีคือเราสามารถกำหนดตัวแปรให้มารับค่าหลังจากการอ่านไฟล์ได้ โดยที่ไฟล์ที่ import เข้ามานั้นจะไม่ติดตัวแปรเดิม ตัวอย่างเช่น
จะเห็นว่าตัวแปร d นั้นไม่ใช่ struct ซ้อน struct เหมือนตัวแปร s ในตัวอย่างก่อนหน้านี้
1. เปิดไฟล์ โดยใช้คำสั่ง fopen(filename,permission)
2. เขียนข้อมูลลงไฟล์ โดยใช้คำสั่ง fprintf(fileID,formatSpec,A1,...,An)
3. ปิดไฟล์ โดยใช้คำสั่ง fclose(fileID)
ไม่สามารถทำข้ามขั้นได้ และเราต้องปิดไฟล์ทุกครั้งหลังจากเขียนเสร็จ ไม่เช่นนั้นโปรแกรมอื่นอาจไม่สามารถอ่านไฟล์นั้นได้
ในขั้นตอนการเปิดไฟล์นั้นเราต้องกำหนดรูปแบบการเข้าถึงไฟล์ด้วย ซึ่งมีดังนี้
ตัวอย่างเช่น
ผลรัน
ในคำสั่ง fprintf เราจะเห็นว่ามีคำสั่งพิเศษ เช่น \t ใช้แทน tab ส่วน \r\n ใช้แทน enter เพื่อขึ้นบรรทัดใหม่ ซึ่งคำสั่งพวกนี้จะมีผลกับข้อมูลที่เราเขียนลงในไฟล์
เป็นวิธีที่ง่ายที่สุด แต่ก็มีข้อจำกัดคือ ถ้าหากในไฟล์ .txt นั้นมีตัวอักษรอยู่ คำสั่งนี้จะ error สรุปแล้วก็คือ คำสั่งนี้ใช้อ่านได้เฉพาะไฟล์ .txt ที่มีแค่ตัวเลขเท่านั้น แต่ก็มีวิธีแก้ไขอยู่เช่นกันโดยการเปิดไฟล์ .txt กับโปรแกรม Notepad แล้วใส่เครื่องหมาย % เอาไว้หน้าบรรทัดทุกบรรทัดที่มีตัวอักษรอยู่ เราก็จะสามารถอ่านไฟล์นั้นได้โดยไม่ error ตัวอย่างเช่น
โปรแกรมแจ้งเตือน error เมื่อเราพยายามอ่านไฟล์ที่มีอักษรอยู่ภายใน แต่โปรแกรมจะสามารถอ่านค่าได้เมื่อเราใส่เครื่องหมาย % หน้าบรรทัดที่มีตัวอักษร
2. อ่านโดยใช้คำสั่ง textscan
จริงๆ แล้วคำสั่งอ่าน text file นั้นมีหลายคำสั่ง แต่โดยส่วนมากจะเป็นการอ่านข้อมูลแบบตัวเลขอย่างเดียว หรือตัวอักษรอย่างเดียว และหลายๆ คำสั่งถึงแม้จะอ่านข้อมูลได้ แต่ก็จะสูญเสียการจัดรูปแบบของข้อมูลไปด้วย เช่น แทนที่จะได้ข้อมูลแบบ 5 คอลัมภ์ ก็จะได้ข้อมูลแถวเดียว ที่มีตัวเลขเรียงต่อกันยาว ดังนั้นผมจึงแนะนำให้ใช้คำสั่ง textscan จะให้ผลลัพธ์ที่ตรงกับรูปแบบเดิมที่สุดครับ
ในตัวอย่างนี้ ผมทดลองใช้คำสั่ง textscan ให้ดู 3 คำสั่งครับ ซึ่งเก็บข้อมูลไว้ในตัวแปร X1, X2 และ X3 ตามลำดับ
สังเกตุดูนะครับว่า การทำงานของโค้ดจะมี 3 ขั้นตอนเสมอ นั่นคือ เปิดไฟล์ อ่านไฟล์ และปิดไฟล์ เรียงลำดับอย่างนี้เสมอ
แล้วทำไมในตัวอย่างนี้ผมต้องใช้คำสั่ง textscan ถึง 3 ครั้งด้วยละ นั่นก็เพราะว่าผมต้องการให้ผู้อ่านเห็นถึงความแตกต่าง และเข้าใจการอ่านข้อมูลให้มากขึ้นครับ ส่วนที่ว่ามันต่างกันยังไงนั้น เรามาดูกันเลยครับ
บรรทัด X1 เป็นบรรทัดแรกที่อ่านไฟล์ หลังจากเปิดไฟล์ขึ้นมา โดยในช่องคอมม่าที่ 2 จะเห็นว่ามีคำสั่ง %f เรียงกันอยู่ 5 ตัว นั่นเป็นเพราะว่าเราต้องการอ่านข้อมูลตัวเลข ซึ่งในไฟล์ที่เราจะอ่านนั้นมีอยู่ 5 คอลัมภ์ เราเลยต้องใช้ %f เรียงกัน 5 ตัวครับ ส่วนในช่องถัดมาจะเห็นคำว่า HeaderLines และหลังจากนั้นก็เป็นเลข 1 หมายความว่า ในไฟล์นี้มีชื่อคอลัมภ์อยู่ด้วย ซึ่งอยู่บรรทัดที่ 1 ในไฟล์ ไม่ต้องอ่านข้อมูลบรรทัดนี้เข้ามา ส่วนคำสั่งสุดท้ายคือ CollectOutput คำสั่งนี้ ถ้ากำหนดให้เป็น true โปรแกรมจะรวมข้อมูลทั้งหมดเอามาไว้ในอาเรย์เดียวกัน แต่ถ้ากำหนดเป็น false โปรแกรมจะแยกข้อมูลแต่ละอันเอาไว้คนละเซลล์
บรรทัด X2 ผมทดสอบให้ดูว่า เมื่อเราใช้คำสั่ง textscan อีกครั้ง โดยที่ไม่ปิดไฟล์ก่อน ผลที่ได้จะเป็นยังไง แต่คราวนี้เปลี่ยนรูปแบบการอ่านเป็น %s เรียงกัน 5 ตัว ก็คือให้อ่านเป็นตัวอักษร 5 คอลัมภ์ แต่การอ่านในครั้งนี้ เราจะไม่ได้ข้อมูลอะไรออกมาเลย ไม่ใช่เพราะว่าเราเขียนโค้ดไม่ถูกนะครับ เพียงแต่ว่ากระบวนการอ่านไฟล์นั้น มันจะมีตัวชี้ตำแหน่งอยู่ แต่ MATLAB อำนวยความสะดวกให้เรามากๆ ดังนั้นตัวชี้ตำแหน่งนี้ จะถูกกำหนดค่าโดยอัตโนมัติ คือ เมื่อเปิดไฟล์ขึ้นมาปุ๊ป ตัวชี้ตำแหน่งจะไปอยู่ที่ตำแหน่งแรกเสมอ และหลังจากอ่านข้อมูลเสร็จ ตัวชี้ตำแหน่งก็จะถูกเลื่อนไปตำแหน่งท้ายสุดเสมอ (ขึ้นอยู่กับคำสั่งที่ใช้อ่าน ว่าอ่านทั้งไฟล์ หรืออ่านทีละบรรทัด) ซึ่งคำสั่ง textscan ที่เราใช้นั้นเป็นการอ่านข้อมูลทั้งหมดในไฟล์ ดังนั้นเมื่ออ่านเสร็จ ตัวชี้ตำแหน่งจึงเลื่อนไปอยู่ท้ายสุดในไฟล์ พอเราอ่านข้อมูลใหม่อีกครั้งโดยไม่ปิดไฟล์ ก็เลยไม่มีข้อมูลใดๆ คืนกลับมา ดังนั้นอย่าเข้าใจผิดว่าเราเขียนโค้ดไม่ถูก หรือข้อมูลในไฟล์ถูกลบนะครับ ส่วนการกำหนดค่า CollectOutput เป็น false นั้น เพราะว่าในไฟล์ของเรามีข้อมูลทั้งตัวเลข และตัวอักษร เราจึงต้องเก็บข้อมูลไว้ในรูปแบบของเซลล์ครับ ไม่สามารถเก็บข้อมูลเอาไว้ในรูปแบบของอาเรย์ธรรมดาได้ เพราะกฎข้อที่ 1 ของอาเรย์ก็คือ ใช้ใช้เก็บข้อมูลประเภทเดียวกันเท่านั้น เราจึงไม่สามารถเก็บตัวเลข ผสมกับตัวอักษรได้
บรรทัด X3 จะเห็นว่าคำสั่งเหมือน X2 ทุกประการ เพียงแต่ว่า มันถูกเขียนเอาไว้หลังจากปิดไฟล์ และเปิดไฟล์ขึ้นมาใหม่ ดังนั้นจึงสามารถอ่านข้อมูลทั้งหมดในไฟล์ได้ตามปกติ
ปล. ก่อนรันเช็คดูให้แน่ใจนะครับว่าในโฟลเดอร์ของโปรแกรม มีไฟล์ Test01.txt อยู่หรือไม่ และรูปแบบข้อมูลตรงกับในรูปรึเปล่า ถ้าใครยังไม่มี สามารถสร้างไฟล์นี้ขึ้นมาใหม่ได้ โดยใช้โปรแกรมในหัวข้อ 4.2 การเขียนข้อมูลลง txt ไฟล์นะครับ (อยู่ข้างบน)
ผลรัน
สังเกตุนะครับว่า D นั้นเป็นอาเรย์ธรรมดา เพราะเรากำหนดคำสั่ง CollectOutput เป็น true โปรแกรมก็เลยรวมข้อมูลทั้งหมดเอาไว้ในอาเรย์เดียวกันครับ ไม่ได้แยกไว้คนละเซลล์เหมือน K
- การเขียนไฟล์ .xls, .xlsx, .csv
ไฟล์ทั้ง 3 ชนิดนี้สามารถเขียนได้โดยใช้คำสั่งเดียวกัน คือ xlswrite ตัวอย่างเช่น
ผลรัน
ส่วนประเภทของไฟล์ เราสามารถกำหนดได้ในชื่อไฟล์ ที่ใส่ในคำสั่ง xlswrite ได้เลย เช่น Test01.xlsx ก็คือไฟล์ประเภท xlsx หรือถ้าอยากให้เป็นไฟล์ csv ก็บันทึกในชื่อ Test01.csv
- การอ่านไฟล์ .xls, .xlsx, .csv
ไฟล์ทั้ง 3 ชนิดนี้สามารถอ่านโดยใช้คำสั่งเดียวกัน คือ xlsread ตัวอย่างเช่น
คำสั่ง xlsread จะคืนค่ามาทั้งหมด 3 ค่า ได้แก่ num, txt และ raw ซึ่งแต่ละตัวมีความหมายดังนี้
- num ใช้เก็บข้อมูลตัวเลขเท่านั้น
- txt ใช้เก้บข้อมูลตัวอักษรเท่านั้น
- raw คือข้อมูลดิบ หรือข้อมูลต้นฉบับ ซึ่งมีทั้งตัวเลขและตัวอักษร
*ประเภทข้อมูลของ num จะเป็น double ส่วนประเภทของ txt และ raw จะเป็น Cell
4.1 การทำงานกับไฟล์ .mat
- การบันทึกไฟล์ .mat
ไฟล์ .mat คือไฟล์นามสกุลปกติของ matlab เมื่อเราสั่งบันทึกข้อมูล ตัวอย่างเช่นรูปแบบของคำสั่ง save คือ
save(filename,variable)
จากตัวอย่างจะเห็นว่าทั้งชื่อไฟล์ และชื่อตัวแปร จะต้องเขียนในเครื่องหมาย ‘ - ’ เสมอ และไม่ว่าเราจะกำหนดนามสกุลเป็น .mat หรือไม่ ไฟล์ที่เราเซฟก็จะเป็น .mat เสมอ
- การอ่านไฟล์ .mat
เมื่อเราบันทึกได้แล้ว ขั้นต่อไปคือการอ่าน การอ่านไฟล์ .mat ทำได้ 2 วิธีคือ1. ใช้คำสั่ง load(filename)
เมื่อใช้คำสั่งนี้ ค่าตัวแปรที่อยู่ในไฟล์ .mat จะถูกโหลดมาไว้ใน workspace ซึ่งจะสังเกตุเห็นว่ามันมีชื่อเดียวกันกับตัวแปรที่เราบันทึกลงไฟล์ .mat เลย และเพราะเหตุนี้ วิธีนี้จึงมีข้อเสียคือ
A) ไม่ว่าเราจะ load โดยมีตัวแปรมารับค่าหรือไม่ ข้อมูลก็จะยังอยู่ในตัวแปรชื่อเดิมที่เราบันทึกเสมอ และหากว่าเราเอาตัวแปรมารับค่า ก็จะกลายเป็น struct ที่ซ้อนอยู่ใน struct อีกที ทำให้การเข้าถึงข้อมูลยุ่งยากขึ้นไปอีก
B) เมื่อเราใช้คำสั่งนี้ เราจะไม่เห็นว่าตัวแปรอะไร ถูกโหลดขึ้นมา เราต้องมาหาเองว่ามีตัวแปรอะไรที่เพิ่มขึ้นมาใน workspace หรือไม่ก็ต้องมาพิมพ์โค้ดทดสอบใน command window เพื่อดูว่าการโหลดไฟล์นั้นเข้ามา เราจะได้ตัวแปรชื่อว่าอะไรบ้าง ซึ่งเป็นเรื่องที่ไม่สะดวกเลยในการเขียนโปรแกรม
C) ไม่ใช่ว่าโปรแกรมทุกประเภท จะอ่าน และเขียนข้อมูลลง workspace เสมอ ซึ่งโปรแกรมรูปแบบที่ว่านั้นก็คือ ฟังก์ชัน และในการเขียนโปรแกรมเพื่อใช้งานจริงๆ เราก็มักจะเขียนไว้ในรูปฟังก์ชันด้วย ดังนั้นคำสั่ง load จึงไม่เหมาะสม
2. ใช้คำสั่ง importdata
คำสั่งนี้ใช้นำเข้าข้อมูลจากไฟล์ได้หลายประเภท และหนึ่งในนั้นคือไฟล์ .mat ซึ่งมีข้อดีคือเราสามารถกำหนดตัวแปรให้มารับค่าหลังจากการอ่านไฟล์ได้ โดยที่ไฟล์ที่ import เข้ามานั้นจะไม่ติดตัวแปรเดิม ตัวอย่างเช่น
จะเห็นว่าตัวแปร d นั้นไม่ใช่ struct ซ้อน struct เหมือนตัวแปร s ในตัวอย่างก่อนหน้านี้
4.2 การอ่านและเขียนไฟล์ .txt
- การเขียนข้อมูลลง txt ไฟล์
การเขียนข้อมูลลงไฟล์ .txt จะไม่เหมือนกับไฟล์ .mat เพราะมันไม่ใช่นามสกุลปกติของไฟล์ MATLAB ดังนั้น จึงต้องทำตามขั้นตอนมาตรฐาน เพื่อให้โปรแกรมอื่นๆ สามารถอ่านไฟล์นี้ได้ด้วย โดยการเขียนข้อมูลลงไฟล์ .txt ทุกครั้ง จะต้องทำตามขั้นตอนดังนี้เสมอ1. เปิดไฟล์ โดยใช้คำสั่ง fopen(filename,permission)
2. เขียนข้อมูลลงไฟล์ โดยใช้คำสั่ง fprintf(fileID,formatSpec,A1,...,An)
3. ปิดไฟล์ โดยใช้คำสั่ง fclose(fileID)
ไม่สามารถทำข้ามขั้นได้ และเราต้องปิดไฟล์ทุกครั้งหลังจากเขียนเสร็จ ไม่เช่นนั้นโปรแกรมอื่นอาจไม่สามารถอ่านไฟล์นั้นได้
ในขั้นตอนการเปิดไฟล์นั้นเราต้องกำหนดรูปแบบการเข้าถึงไฟล์ด้วย ซึ่งมีดังนี้
คำสั่ง
|
ความหมาย
|
'r'
|
เปิดไฟล์เพื่ออ่านอย่างเดียว
|
'w'
|
สร้างใหม่
หรือเปิดไฟล์ที่มีอยู่แล้ว และลบข้อมูลเดิมทิ้งทั้งหมดก่อนเขียนข้อมูลใหม่
|
'a'
|
สร้างใหม่
หรือเปิดไฟล์ที่มีอยู่แล้ว และเพิ่มข้อมูลต่อท้ายข้อมูลเดิมที่มีอยู่
|
'r+'
|
เปิดไฟล์เพื่ออ่านและเขียน
|
'w+'
|
เปิดไฟล์เพื่ออ่านและเขียน
โดยลบข้อมูลเดิมทิ้งทั้งหมด
|
'a+'
|
เปิดไฟล์เพื่ออ่านและเขยน
โดยเขียนต่อท้ายจากข้อมูลที่มีอยู่เดิม
|
ตัวอย่างเช่น
clc;clear;close all; fileID = fopen('Test01.txt','w+'); A = randi([1,10],20,5); fprintf(fileID,'%s\t%s\t%s\t%s\t%s\r\n','A','B','C','D','E'); r = size(A,1); % return row number only for m=1:r fprintf(fileID,'%d\t%d\t%d\t%d\t%d\r\n',A(m,1),A(m,2),A(m,3),A(m,4),A(m,5)); end fclose(fileID);
ผลรัน
ในคำสั่ง fprintf เราจะเห็นว่ามีคำสั่งพิเศษ เช่น \t ใช้แทน tab ส่วน \r\n ใช้แทน enter เพื่อขึ้นบรรทัดใหม่ ซึ่งคำสั่งพวกนี้จะมีผลกับข้อมูลที่เราเขียนลงในไฟล์
- การอ่านข้อมูลจากไฟล์ .txt
1. อ่านโดยใช้คำสั่ง loadเป็นวิธีที่ง่ายที่สุด แต่ก็มีข้อจำกัดคือ ถ้าหากในไฟล์ .txt นั้นมีตัวอักษรอยู่ คำสั่งนี้จะ error สรุปแล้วก็คือ คำสั่งนี้ใช้อ่านได้เฉพาะไฟล์ .txt ที่มีแค่ตัวเลขเท่านั้น แต่ก็มีวิธีแก้ไขอยู่เช่นกันโดยการเปิดไฟล์ .txt กับโปรแกรม Notepad แล้วใส่เครื่องหมาย % เอาไว้หน้าบรรทัดทุกบรรทัดที่มีตัวอักษรอยู่ เราก็จะสามารถอ่านไฟล์นั้นได้โดยไม่ error ตัวอย่างเช่น
โปรแกรมแจ้งเตือน error เมื่อเราพยายามอ่านไฟล์ที่มีอักษรอยู่ภายใน แต่โปรแกรมจะสามารถอ่านค่าได้เมื่อเราใส่เครื่องหมาย % หน้าบรรทัดที่มีตัวอักษร
2. อ่านโดยใช้คำสั่ง textscan
จริงๆ แล้วคำสั่งอ่าน text file นั้นมีหลายคำสั่ง แต่โดยส่วนมากจะเป็นการอ่านข้อมูลแบบตัวเลขอย่างเดียว หรือตัวอักษรอย่างเดียว และหลายๆ คำสั่งถึงแม้จะอ่านข้อมูลได้ แต่ก็จะสูญเสียการจัดรูปแบบของข้อมูลไปด้วย เช่น แทนที่จะได้ข้อมูลแบบ 5 คอลัมภ์ ก็จะได้ข้อมูลแถวเดียว ที่มีตัวเลขเรียงต่อกันยาว ดังนั้นผมจึงแนะนำให้ใช้คำสั่ง textscan จะให้ผลลัพธ์ที่ตรงกับรูปแบบเดิมที่สุดครับ
clc;clear;close all; format compact fid = fopen('Test01.txt','r'); X1 = textscan(fid,'%f%f%f%f%f','HeaderLines',1,'CollectOutput',true); D = X1{1} X2 = textscan(fid,'%s%s%s%s%s','CollectOutput',false); %no output S = X2{1} fclose(fid); fid = fopen('Test01.txt','r'); X3 = textscan(fid,'%s%s%s%s%s','CollectOutput',false); K = [X3{1} X3{2} X3{3} X3{4} X3{5}] fclose(fid);
ในตัวอย่างนี้ ผมทดลองใช้คำสั่ง textscan ให้ดู 3 คำสั่งครับ ซึ่งเก็บข้อมูลไว้ในตัวแปร X1, X2 และ X3 ตามลำดับ
สังเกตุดูนะครับว่า การทำงานของโค้ดจะมี 3 ขั้นตอนเสมอ นั่นคือ เปิดไฟล์ อ่านไฟล์ และปิดไฟล์ เรียงลำดับอย่างนี้เสมอ
แล้วทำไมในตัวอย่างนี้ผมต้องใช้คำสั่ง textscan ถึง 3 ครั้งด้วยละ นั่นก็เพราะว่าผมต้องการให้ผู้อ่านเห็นถึงความแตกต่าง และเข้าใจการอ่านข้อมูลให้มากขึ้นครับ ส่วนที่ว่ามันต่างกันยังไงนั้น เรามาดูกันเลยครับ
บรรทัด X1 เป็นบรรทัดแรกที่อ่านไฟล์ หลังจากเปิดไฟล์ขึ้นมา โดยในช่องคอมม่าที่ 2 จะเห็นว่ามีคำสั่ง %f เรียงกันอยู่ 5 ตัว นั่นเป็นเพราะว่าเราต้องการอ่านข้อมูลตัวเลข ซึ่งในไฟล์ที่เราจะอ่านนั้นมีอยู่ 5 คอลัมภ์ เราเลยต้องใช้ %f เรียงกัน 5 ตัวครับ ส่วนในช่องถัดมาจะเห็นคำว่า HeaderLines และหลังจากนั้นก็เป็นเลข 1 หมายความว่า ในไฟล์นี้มีชื่อคอลัมภ์อยู่ด้วย ซึ่งอยู่บรรทัดที่ 1 ในไฟล์ ไม่ต้องอ่านข้อมูลบรรทัดนี้เข้ามา ส่วนคำสั่งสุดท้ายคือ CollectOutput คำสั่งนี้ ถ้ากำหนดให้เป็น true โปรแกรมจะรวมข้อมูลทั้งหมดเอามาไว้ในอาเรย์เดียวกัน แต่ถ้ากำหนดเป็น false โปรแกรมจะแยกข้อมูลแต่ละอันเอาไว้คนละเซลล์
บรรทัด X2 ผมทดสอบให้ดูว่า เมื่อเราใช้คำสั่ง textscan อีกครั้ง โดยที่ไม่ปิดไฟล์ก่อน ผลที่ได้จะเป็นยังไง แต่คราวนี้เปลี่ยนรูปแบบการอ่านเป็น %s เรียงกัน 5 ตัว ก็คือให้อ่านเป็นตัวอักษร 5 คอลัมภ์ แต่การอ่านในครั้งนี้ เราจะไม่ได้ข้อมูลอะไรออกมาเลย ไม่ใช่เพราะว่าเราเขียนโค้ดไม่ถูกนะครับ เพียงแต่ว่ากระบวนการอ่านไฟล์นั้น มันจะมีตัวชี้ตำแหน่งอยู่ แต่ MATLAB อำนวยความสะดวกให้เรามากๆ ดังนั้นตัวชี้ตำแหน่งนี้ จะถูกกำหนดค่าโดยอัตโนมัติ คือ เมื่อเปิดไฟล์ขึ้นมาปุ๊ป ตัวชี้ตำแหน่งจะไปอยู่ที่ตำแหน่งแรกเสมอ และหลังจากอ่านข้อมูลเสร็จ ตัวชี้ตำแหน่งก็จะถูกเลื่อนไปตำแหน่งท้ายสุดเสมอ (ขึ้นอยู่กับคำสั่งที่ใช้อ่าน ว่าอ่านทั้งไฟล์ หรืออ่านทีละบรรทัด) ซึ่งคำสั่ง textscan ที่เราใช้นั้นเป็นการอ่านข้อมูลทั้งหมดในไฟล์ ดังนั้นเมื่ออ่านเสร็จ ตัวชี้ตำแหน่งจึงเลื่อนไปอยู่ท้ายสุดในไฟล์ พอเราอ่านข้อมูลใหม่อีกครั้งโดยไม่ปิดไฟล์ ก็เลยไม่มีข้อมูลใดๆ คืนกลับมา ดังนั้นอย่าเข้าใจผิดว่าเราเขียนโค้ดไม่ถูก หรือข้อมูลในไฟล์ถูกลบนะครับ ส่วนการกำหนดค่า CollectOutput เป็น false นั้น เพราะว่าในไฟล์ของเรามีข้อมูลทั้งตัวเลข และตัวอักษร เราจึงต้องเก็บข้อมูลไว้ในรูปแบบของเซลล์ครับ ไม่สามารถเก็บข้อมูลเอาไว้ในรูปแบบของอาเรย์ธรรมดาได้ เพราะกฎข้อที่ 1 ของอาเรย์ก็คือ ใช้ใช้เก็บข้อมูลประเภทเดียวกันเท่านั้น เราจึงไม่สามารถเก็บตัวเลข ผสมกับตัวอักษรได้
บรรทัด X3 จะเห็นว่าคำสั่งเหมือน X2 ทุกประการ เพียงแต่ว่า มันถูกเขียนเอาไว้หลังจากปิดไฟล์ และเปิดไฟล์ขึ้นมาใหม่ ดังนั้นจึงสามารถอ่านข้อมูลทั้งหมดในไฟล์ได้ตามปกติ
ปล. ก่อนรันเช็คดูให้แน่ใจนะครับว่าในโฟลเดอร์ของโปรแกรม มีไฟล์ Test01.txt อยู่หรือไม่ และรูปแบบข้อมูลตรงกับในรูปรึเปล่า ถ้าใครยังไม่มี สามารถสร้างไฟล์นี้ขึ้นมาใหม่ได้ โดยใช้โปรแกรมในหัวข้อ 4.2 การเขียนข้อมูลลง txt ไฟล์นะครับ (อยู่ข้างบน)
ผลรัน
สังเกตุนะครับว่า D นั้นเป็นอาเรย์ธรรมดา เพราะเรากำหนดคำสั่ง CollectOutput เป็น true โปรแกรมก็เลยรวมข้อมูลทั้งหมดเอาไว้ในอาเรย์เดียวกันครับ ไม่ได้แยกไว้คนละเซลล์เหมือน K
4.3 การอ่านแลเขียนข้อมูลลงไฟล์ .xls, .xlsx, .csv
ไฟล์ทั้ง 3 ชนิดนี้ จัดเป็นไฟล์ของโปรแกรม excel เหมือนกัน ส่วนที่ต่างกันคือ .xls เป็นไฟล์ excel ของ office 2003 ส่วน .xlsx เป็นไฟล์ของ office 2007 ขึ้นมา ส่วนไฟล์ .csv เป็นไฟล์เก็บเฉพาะข้อมูลตัวเลข และในไฟล์จะมีแค่ชีทเดียวเท่านั้น ซึ่งต่างจากไฟล์ .xlsx ที่สามารถเก็บข้อมูลได้ทุกประเภท และมีกี่ชีทก็ได้- การเขียนไฟล์ .xls, .xlsx, .csv
ไฟล์ทั้ง 3 ชนิดนี้สามารถเขียนได้โดยใช้คำสั่งเดียวกัน คือ xlswrite ตัวอย่างเช่น
clc;clear;close all; A = randi([1 10],20,5); B = num2cell(A); %convert to cell array Head = {'A','B','C','D','E'}; xlswrite('Test02.xlsx',[Head;B]);
ผลรัน
ส่วนประเภทของไฟล์ เราสามารถกำหนดได้ในชื่อไฟล์ ที่ใส่ในคำสั่ง xlswrite ได้เลย เช่น Test01.xlsx ก็คือไฟล์ประเภท xlsx หรือถ้าอยากให้เป็นไฟล์ csv ก็บันทึกในชื่อ Test01.csv
- การอ่านไฟล์ .xls, .xlsx, .csv
ไฟล์ทั้ง 3 ชนิดนี้สามารถอ่านโดยใช้คำสั่งเดียวกัน คือ xlsread ตัวอย่างเช่น
คำสั่ง xlsread จะคืนค่ามาทั้งหมด 3 ค่า ได้แก่ num, txt และ raw ซึ่งแต่ละตัวมีความหมายดังนี้
- num ใช้เก็บข้อมูลตัวเลขเท่านั้น
- txt ใช้เก้บข้อมูลตัวอักษรเท่านั้น
- raw คือข้อมูลดิบ หรือข้อมูลต้นฉบับ ซึ่งมีทั้งตัวเลขและตัวอักษร
*ประเภทข้อมูลของ num จะเป็น double ส่วนประเภทของ txt และ raw จะเป็น Cell
จบหัวข้อที่ 4