Lua Academy · Lektion

Læsning af filindhold

Læs linjer, bytes og hele filindholdet med file:read()-metoder.

Lektion 2 af 412 trin

Læsning af filindhold er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lua Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lua Academy-kurset indeholder 4 lektioner i alt.

Læs hele filen

Brug f:read("a") (eller "*a") til at læse hele filen ind i en streng. Det er enkelt og fungerer fint for små og mellemstore filer. For meget store filer bør du læse i blokke eller linje for linje for at undgå problemer med hukommelsen.

local f = io.open("config.txt", "r")
if f then
  local content = f:read("a")
  f:close()
  print("Size:", #content, "bytes")
  print(content)
end

Læs linje for linje

f:read("l") læser den næste linje og fjerner linjeskiftet. Returnerer nil ved EOF. Brug while til at behandle hver linje. f:lines() er den idiomatiske kortform, der gør det samme.

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

Læs et fast antal byte

Giv et tal til f:read(n) for at læse præcis n byte. Returnerer en streng med op til n byte (færre, hvis EOF nås) eller nil ved EOF. Brug det til binære protokoller eller strukturerede filformater.

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

Læs et tal

f:read("n") læser det næste tal fra filen og springer mellemrum over. Returnerer et Lua-tal eller nil, hvis det næste token ikke er et tal. Det er nyttigt til læsning af strukturerede datafiler med tal.

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

Søgning i filer

f:seek(whence, offset) flytter filpositionen. whence er "set" (fra begyndelsen), "cur" (fra den aktuelle position) eller "end" (fra slutningen). Returnerer den nye absolutte position. Brug det til at læse dele igen eller springe rundt i filer.

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

Læsning af CSV-filer

Analysér CSV-data linje for linje: læs hver linje, og opdel den derefter ved kommaer med string.gmatch. I produktionskode skal du håndtere citationstegn omkring felter og kommaer inde i citationstegn, men til simple data fungerer en grundlæggende opdeling.

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"}}

Læsning af konfigurationsfiler

Et enkelt konfigurationsformat med nøgle=værdi: læs linje for linje, spring kommentarer og tomme linjer over, og analysér nøgle=værdi-par med 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)

Blokvis læsning

For store filer skal du læse i blokke med fast størrelse for at undgå at indlæse alt i hukommelsen. Behandl hver blok, efterhånden som den ankommer. Det er afgørende for filer, der er større end den tilgængelige 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

Læsning af flere værdier pr. linje

Når hver linje indeholder flere værdier adskilt af mellemrum eller tabulatorer, kan du bruge string.match eller string.gmatch til at udtrække dem. Dette mønster håndterer simple strukturerede tekstfiler.

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

Genvej med io.lines

io.lines(filename) åbner filen, returnerer en linjeiterator og lukker filen, når den er færdig. Det er den korteste måde at læse en fil linje for linje på uden eksplicit at administrere håndtaget.

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

Hurtigt tjek

Hvad returnerer f:read("a"), når filmarkøren allerede står ved EOF?

Opsummering: Læsning af filer

Opsummering:

  • f:read("a") — hele filen som streng
  • f:read("l") — én linje uden linjeskift
  • f:read(n) — præcis n byte
  • f:read("n") — det næste tal
  • io.lines(path) — linjeiterator, lukker automatisk
  • f:seek() — spring til en position
Gratis at komme i gang

Lær Lua med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
40
Lektioner
159

Ofte stillede spørgsmål

Er lektionen “Læsning af filindhold” gratis?

Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Læsning af filindhold”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lua Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Læsning af filindhold”?

Læs linjer, bytes og hele filindholdet med file:read()-metoder. Du øver dig i Lua Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Lua Academy?

Der kræves ingen tidligere erfaring. Lua Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Læsning af filindhold”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Lua Academy-lektion?

Ja. Alle Lua Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Åbning af filer med io.open
  2. Læsning af filindhold
  3. Skrivning til og tilføjelse i filer
  4. Lukning af filer og fejlhåndtering
← Tilbage til Lua Academy