ファイル内容の読み込み
file:read()メソッドで行、バイト、ファイル全体を読み込みます。
「ファイル内容の読み込み」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これは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)
end1行ずつ読み取る
f:read("l")は次の行を読み取り、改行を取り除きます。EOFではnilを返します。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に達した場合はそれより少なくなります。EOFではnilを返します。バイナリプロトコルや構造化ファイル形式で使用します。
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()
endCSVファイルを読み取る
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形式の設定ファイルでは、行単位で読み取り、コメントと空行をスキップして、string.matchでkey=valueの組を解析します。
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
end1行に複数の値を読み取る
各行に空白またはタブで区切られた複数の値が含まれる場合は、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)
endio.linesのショートカット
io.lines(filename)はファイルを開き、行イテレーターを返し、処理が終わるとファイルを閉じます。ハンドルを明示的に管理せずにファイルを1行ずつ読み取る、最も簡潔な方法です。
-- 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)確認問題
ファイルポインターがすでにEOFにある場合、f:read("a")は何を返しますか?
復習: ファイルの読み取り
まとめ:
f:read("a")— ファイル全体を文字列として読み取りますf:read("l")— 改行なしで1行読み取りますf:read(n)— nバイト読み取りますf:read("n")— 次の数値を読み取りますio.lines(path)— 行イテレーターを返し、自動的に閉じますf:seek()— 指定位置に移動します
よくある質問
「ファイル内容の読み込み」レッスンは無料ですか?
はい。「ファイル内容の読み込み」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「ファイル内容の読み込み」で何を学びますか?
file:read()メソッドで行、バイト、ファイル全体を読み込みます。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「ファイル内容の読み込み」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。