การอ่านเนื้อหาไฟล์
อ่านบรรทัด ไบต์ และเนื้อหาทั้งหมดด้วยเมธอด file:read()
การอ่านเนื้อหาไฟล์ เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
อ่านไฟล์ทั้งไฟล์
ใช้ f:read("a") (หรือ "*a") เพื่ออ่านไฟล์ทั้งหมดเป็นสตริง วิธีนี้เรียบง่ายและเหมาะสำหรับไฟล์ขนาดเล็กถึงปานกลาง สำหรับไฟล์ขนาดใหญ่มาก ให้อ่านเป็นช่วง ๆ หรืออ่านทีละบรรทัดเพื่อหลีกเลี่ยงปัญหาหน่วยความจำ
local f = io.open("config.txt", "r")
if f then
local content = f:read("a")
f:close()
print("Size:", #content, "bytes")
print(content)
endอ่านทีละบรรทัด
f:read("l") อ่านบรรทัดถัดไปโดยตัดอักขระขึ้นบรรทัดใหม่ออก และคืนค่า nil เมื่อถึง EOF ใช้ while เพื่อประมวลผลแต่ละบรรทัด ส่วน f:lines() เป็นรูปแบบย่อที่ใช้กันตามสำนวนของภาษาและทำงานแบบเดียวกัน
local f = io.open("data.txt", "r")
if f then
local line = f:read("l")
while line ~= nil do
print(line)
line = f:read("l")
end
f:close()
end
-- Equivalent with for loop:
-- for line in io.lines("data.txt") do print(line) endอ่านไบต์ตามจำนวนที่กำหนด
ส่งตัวเลขให้ f:read(n) เพื่ออ่านไบต์จำนวน n พอดี โดยจะคืนค่าสตริงที่มีไบต์ไม่เกิน n ไบต์ (อาจน้อยกว่านั้นหากถึง EOF) หรือคืนค่า nil เมื่อถึง EOF ใช้สำหรับโพรโทคอลไบนารีหรือรูปแบบไฟล์ที่มีโครงสร้าง
local f = io.open("binary.dat", "rb")
if f then
-- Read 4-byte header
local header = f:read(4)
if header then
print("Header bytes:", #header)
for i = 1, #header do
io.write(string.format("%02X ", header:byte(i)))
end
print()
end
f:close()
endอ่านตัวเลข
f:read("n") อ่านตัวเลขถัดไปจากไฟล์โดยข้ามช่องว่าง และคืนค่าเป็นตัวเลขของ Lua หรือคืนค่า nil หากโทเค็นถัดไปไม่ใช่ตัวเลข เหมาะสำหรับการอ่านไฟล์ข้อมูลตัวเลขที่มีโครงสร้าง
-- File contains: "10 20 30.5 40"
local f = io.open("nums.txt", "r")
if f then
local total = 0
local n = f:read("n")
while n do
total = total + n
n = f:read("n")
end
f:close()
print("Sum:", total)
endการเลื่อนตำแหน่งในไฟล์
f:seek(whence, offset) เปลี่ยนตำแหน่งในไฟล์ whence คือ "set" (นับจากจุดเริ่มต้น), "cur" (นับจากตำแหน่งปัจจุบัน) หรือ "end" (นับจากท้ายไฟล์) ฟังก์ชันคืนค่าตำแหน่งสัมบูรณ์ใหม่ ใช้เพื่ออ่านข้อมูลซ้ำหรือข้ามไปยังตำแหน่งต่าง ๆ ในไฟล์
local f = io.open("test.txt", "r")
if f then
-- Jump to end, get file size
local size = f:seek("end")
print("File size:", size, "bytes")
-- Seek back to start
f:seek("set", 0)
local first_line = f:read("l")
print("First line:", first_line)
f:close()
endการอ่านไฟล์ CSV
แยกวิเคราะห์ข้อมูล CSV ทีละบรรทัด โดยอ่านแต่ละบรรทัดแล้วแยกด้วยจุลภาคโดยใช้ string.gmatch สำหรับการใช้งานจริง ควรรองรับฟิลด์ที่อยู่ในเครื่องหมายคำพูดและจุลภาคภายในเครื่องหมายคำพูดด้วย แต่สำหรับข้อมูลอย่างง่าย การแยกพื้นฐานก็เพียงพอ
local function parseCSV(path)
local rows = {}
for line in io.lines(path) do
local row = {}
for field in string.gmatch(line, "([^,]+)") do
row[#row+1] = field
end
rows[#rows+1] = row
end
return rows
end
-- Example: "Alice,30,Engineer"
-- => {{"Alice","30","Engineer"}}การอ่านไฟล์การกำหนดค่า
รูปแบบการกำหนดค่าอย่างง่ายแบบ key=value: อ่านทีละบรรทัด ข้ามความคิดเห็นและบรรทัดว่าง แล้วแยกคู่ key=value ด้วย string.match
local function loadConfig(path)
local cfg = {}
for line in io.lines(path) do
-- Skip comments and blank lines
if not line:match("^%s*#") and line:match("%S") then
local k, v = line:match("^%s*(%w+)%s*=%s*(.-)%s*$")
if k then cfg[k] = v end
end
end
return cfg
end
local config = loadConfig("app.conf")
print(config.host, config.port)การอ่านเป็นช่วง ๆ
สำหรับไฟล์ขนาดใหญ่ ให้อ่านเป็นช่วงที่มีขนาดคงที่เพื่อหลีกเลี่ยงการโหลดข้อมูลทั้งหมดลงหน่วยความจำ ประมวลผลแต่ละช่วงทันทีที่อ่านเข้ามา วิธีนี้จำเป็นอย่างยิ่งสำหรับไฟล์ที่มีขนาดใหญ่กว่าหน่วยความจำ RAM ที่พร้อมใช้งาน
local function processLarge(path, chunkSize)
chunkSize = chunkSize or 4096
local f, err = io.open(path, "rb")
if not f then return nil, err end
local totalBytes = 0
local chunk = f:read(chunkSize)
while chunk do
totalBytes = totalBytes + #chunk
-- process chunk here
chunk = f:read(chunkSize)
end
f:close()
return totalBytes
endการอ่านค่าหลายค่าต่อบรรทัด
เมื่อแต่ละบรรทัดมีค่าหลายค่าที่คั่นด้วยช่องว่างหรือแท็บ ให้ใช้ string.match หรือ string.gmatch เพื่อดึงค่าเหล่านั้น รูปแบบนี้รองรับไฟล์ข้อความที่มีโครงสร้างอย่างง่าย
-- File: "Alice 95 A\nBob 87 B"
local results = {}
for line in io.lines("grades.txt") do
local name, score, grade = line:match("(%S+)%s+(%d+)%s+(%S+)")
if name then
results[#results+1] = {
name=name,
score=tonumber(score),
grade=grade
}
end
end
for _, r in ipairs(results) do
print(r.name, r.score, r.grade)
endทางลัด io.lines
io.lines(filename) เปิดไฟล์ คืนค่าตัววนซ้ำสำหรับบรรทัด และปิดไฟล์เมื่อเสร็จสิ้น นี่เป็นวิธีที่กระชับที่สุดในการอ่านไฟล์ทีละบรรทัดโดยไม่ต้องจัดการแฮนเดิลเองอย่างชัดเจน
-- Count non-empty lines
local count = 0
for line in io.lines("data.txt") do
if line:match("%S") then
count = count + 1
end
end
print("Non-empty lines:", count)
-- Collect all lines into a table
local lines = {}
for line in io.lines("data.txt") do
lines[#lines+1] = line
end
print("Total lines:", #lines)ตรวจสอบอย่างรวดเร็ว
f:read("a") คืนค่าอะไรเมื่อพอยน์เตอร์ไฟล์อยู่ที่ EOF อยู่แล้ว
สรุป: การอ่านไฟล์
สรุป:
f:read("a")— ไฟล์ทั้งหมดเป็นสตริงf:read("l")— หนึ่งบรรทัดโดยไม่มีอักขระขึ้นบรรทัดใหม่f:read(n)— ไบต์จำนวน n พอดีf:read("n")— ตัวเลขถัดไปio.lines(path)— ตัววนซ้ำสำหรับบรรทัดและปิดไฟล์โดยอัตโนมัติf:seek()— ข้ามไปยังตำแหน่งที่กำหนด
คำถามที่พบบ่อย
บทเรียน “การอ่านเนื้อหาไฟล์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การอ่านเนื้อหาไฟล์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การอ่านเนื้อหาไฟล์”
อ่านบรรทัด ไบต์ และเนื้อหาทั้งหมดด้วยเมธอด file:read() คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การอ่านเนื้อหาไฟล์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเปิดไฟล์ด้วย io.open
- การอ่านเนื้อหาไฟล์
- การเขียนและเพิ่มข้อมูลลงไฟล์
- การปิดไฟล์และการจัดการข้อผิดพลาด