Lua - File Iterators



Lua provides I/O library to read and manipulate files. In this article, we'll reading a file line by line using an iterator and print each word of it.

File Operations

Before writing the iterator on file contents to read its words, let us first understand file operations to be performed.

Open File In Read Mode

Let us now see how to open a file in read mode first.

-- Opens a file in read mode
file = io.open("example.txt", "r")

-- sets the default input file as example.txt
io.input(file)

Read a Word

-- read the current line
local line = io.read()  -- current line

-- current position in the line
local pos = 1

-- find the string separated by whitespace
local s, e = string.find(line, "%w+", pos)

-- print the word read
print(string.sub(line, s, e))

Close File

-- close the opened file
io.close(file)

Creating an Iterator to read words

Let's create an iterator function which will read each line of the file opened and return the next word.

function allwords ()
   -- read the current line
   local line = io.read()  -- current line

   -- current position in the line
   local pos = 1

   -- iterator function
   return function ()

      -- repeat until there are lines
      while line do

         -- find the next word
         local s, e = string.find(line, "%w+", pos)
         -- if word is found
         if s then
            -- set the next position after current word
            pos = e + 1
            -- return the word
            return string.sub(line, s, e)
         else
            -- if word is not present, read next line
            line = io.read()
            -- reset the position to 1
            pos = 1
         end
      end
      -- if no more line, terminate the traversal
      return nil
   end
end

Use Iterator to read words via for loop

Using for loop on an iterator is pretty straight forward as shown below:

-- iterate through all words and print word by word
for word in allwords() do
   print(word)
end

Complete Example of using Iterator to read words from a file

we will use a sample file example.txt as shown below−

example.txt

Welcome to tutorialspoint.com
Simply Easy Learning

main.lua

-- Opens a file in read mode
file = io.open("example.txt", "r")

-- sets the default input file as test.lua
io.input(file)

-- iterator function
function allwords ()
   -- read the current line
   local line = io.read()  -- current line

   -- current position in the line
   local pos = 1

   -- iterator function
   return function ()

      -- repeat until there are lines
      while line do

         -- find the next word
         local s, e = string.find(line, "%w+", pos)
         -- if word is found
         if s then
            -- set the next position after current word
            pos = e + 1
            -- return the word
            return string.sub(line, s, e)
         else
            -- if word is not present, read next line
            line = io.read()
            -- reset the position to 1
            pos = 1
         end
      end
      -- if no more line, terminate the traversal
      return nil
   end
end

-- iterate through all words and print word by word
for word in allwords() do
   print(word)
end

-- close the opened file
io.close(file)

Output

When the above code is built and executed, it produces the following result −

Welcome
to
tutorialspoint
com
Simply
Easy
Learning
Advertisements