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