[file]
creates an object that Lasso can use to interact with a file in the filesystem. You can create an empty file object and specify the path later, or you can call the creator method with the path to a file as a parameter. You can also optionally specify the open and get mode indicators.
When a file connection is opened using the [file]
tag, several different open modes can be used. These modes optimize the file connection for best performance depending on the purpose of the connection. A get mode may also be specified to determine how the file will be read (by line or by character). The open and get modes are described below.
[file_modeline]
passing this method in for the get mode sets the file object to be read one line at a time[file_modechar]
passing this method in for the get mode sets the file object to be read one character at a time[io_file_o_rdonly]
sets the file to be open just for reading[io_file_o_wronly]
sets the file to be open just for writing[io_file_o_rdwr]
sets the file to be open for reading and writing[io_file_o_creat]
sets the file mode to allow you to create the file[io_file_o_append]
opens the file for just appending to the file[io_file_o_trunc]
sets the file mode to allow just truncating the file
It is possible to combine various modes by using [integer_bitOr]
method. For example, if you wanted to open a file for creation and reading and writing, you could do this:
[var(file) = file('/path/to/file', integer_bitOr(io_file_o_creat, io_file_o_rdwr))]
The [file]
type also comes with the following member tags cover the more common open modes: [file->openRead]
, [file->openWrite]
, [file->openWriteOnly]
, [file->openAppend]
, and [file->openTruncate]
var(file) = file()
var(file) = file(path, open_mode, get_mode)
The code below will read the entire contents of a file and return it as a string.
Code
local(f) = file('/path/to/file.txt')
handle => { #f->close }
#f->readString
Result
#f->readString returns the contents of the file as a string, so the result is just the contents of the file
The code below counts the number of fields in a CSV file. Since a CSV file could have a field broken across multiple lines, the code is setup to read a line at a time and check to see if it has a complete CSV row. If not, it continues reading lines until it does.
To set this up, the file object is created with this call: [file(#path, io_file_o_rdonly, file_modeLine)]
. This opens the specified file specifying the open mode as read only and the get mode as returning a line at a time instead of a character at a time.
Code
define csv_fieldCount(path::string)::integer => {
// Open a file to read lines not characters
local(data_file) = file(#path, io_file_o_rdonly, file_modeLine)
handle => {#data_file->close}
// Parsing the CSV file
// Keep reading lines until we run out of lines or until we get a complete CSV line to count # of fields
local(csv_line) = ''
local(parsed_csv) = array
local(need_joining) = ''
while(true) => {
#csv_line = string(#data_file->get)
fail_if(not #csv_line, -1, "NOT A CSV FILE: " + #path)
iterate(#csv_line->split(',')) => {
if(loop_value->first != '"' && #need_joining == '') => {
#parsed_csv->insert(loop_value)
loop_continue
}
loop_value->remove(1,1)
// Count the ending number of " that don't include \"
// (for cases such as \"""", the first " won't be included since it is preceded by a backslash)
// If it ends in an even number, we don't have a properly closed off field yet
local(count_quotes) = regexp(-input=loop_value, -find=`(?:[^\\])("+)$`)
if(loop_value != '"' and (not #count_quotes->find or #count_quotes->matchString(1)->size % 2 == 0)) => {
#need_joining += loop_value + ','
loop_continue
}
#need_joining += loop_value->remove(loop_value->size)&
#parsed_csv->insert(#need_joining)
#need_joining = ''
}
if(#need_joining == '') => { loop_abort }
#need_joining += "\n"
}
return #parsed_csv->size
}
// Assume the contents of /path/to/file.csv look like this:
// "One, field",2,,4,"Fifth field",6
csv_fieldCount('/path/to/file.csv')
Result
6
Please note that periodically LassoSoft will go through the notes and may incorporate information from them into the documentation. Any submission here gives LassoSoft a non-exclusive license and will be made available in various formats to the Lasso community.
©LassoSoft Inc 2015 | Web Development by Treefrog Inc | Privacy | Legal terms and Shipping | Contact LassoSoft
Recent Comments