0Pricing
Lua Academy · レッスン

ファイル内容の読み込み

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)
end

1行ずつ読み取る

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()
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形式の設定ファイルでは、行単位で読み取り、コメントと空行をスキップして、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
end

1行に複数の値を読み取る

各行に空白またはタブで区切られた複数の値が含まれる場合は、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)はファイルを開き、行イテレーターを返し、処理が終わるとファイルを閉じます。ハンドルを明示的に管理せずにファイルを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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. io.openによるファイルのオープン
  2. ファイル内容の読み込み
  3. ファイルへの書き込みと追記
  4. ファイルのクローズとエラー処理
← Lua Academyに戻る