These functions are defined in
readascii.sl. For comma or
tab-delimited files, consider useing the CSV module.
Read data from a text file
Int_Type readascii (file, &v1,...&vN ; qualifiers)
This function may be used to read formatted data from a text (as
opposed to binary) file and stores the values as arrays in the
v1,..., vN (passed as references). It
returns the number of lines read from the file that matched the
format (implicit or specified by a qualifier).
The file parameter may be a string that gives the filename to read,
File_Type object representing an open file pointer, or an
array of lines to be scanned.
The following qualifiers are supported by the function
format=string The sscanf format string to be used when parsing lines. nrows=integer The maximum number of matching rows to handle. ncols=integer If a single reference is passed, it will be assigned an array of ncols arrays of data values. skip=integer Skip the specified number of lines before scanning maxlines=integer Read no more than this many lines. cols=Array_Type Read only the specified (1-based) columns. Used with an implict format delim=string For an implicit format, use this as a field separator. The default is whitespace. type=string For an implicit format, use this sscanf type specifier. Default is %lf (Double_Type). size=integer Use this value as the initial size for the arrays. dsize=integer Use this value as an increment when reallocating the arrays. stop_on_mismatch Stop reading input when a line does not match the format lastline=&v Assign the last line read to the variable v. lastlinenum=&v Assign the last line number (1-based to v) comment=string Lines beginning with this string are ignored. as_list If present, then return data in lists rather than arrays.
As a simple example, consider a file called
The 3 columns may be read and stored in the variables
# Distance Zr Zi 0.0 50.2 0.1 1.0 47.3 -12.2 2.0 43.9 -15.8
After return, The value of
n = readascii ("imped.dat", &x, &zr, &zi);
xwill be set to
Another way to read the same data is to use
In this case,
n = readascii ("imped.dat", &data; ncols=3);
Array_Type, with each element of the array containing the array of data values for the corresponding column. As before,
nwill be 3.
As a more complex example, Consider a file called
This file may be read using
Name Score Date Flags Bill 73.2 03-Nov-2046 1 James 22.9 03-Nov-2046 1 Lucy 89.1 04-Nov-2046 3
In this case,
n = readascii ("score.dat", &name, &score, &date, &flags; format="%s %lf %s %d");
nwill be 3,
scorewill be a
flagswill be an
Now suppose that only the score and flags column are of interest.
date fields may be ignored using
n = readascii ("score.dat", &score, &flags"; format="%*s %lf %*s %d");
%*sindicates that the field is to be parsed as a string, but not assigned to a variable.
Consider the task of reading columns from a file called
books.dat that contain quoted strings such as:
Such a file may be read using
# Year Author Title "1605" "Miguel de Cervantes" "Don Quixote de la Mancha" "1885" "Mark Twain" "The Adventures of Huckleberry Finn" "1955" "Vladimir Nabokov" "Lolita"
n = readascii ("books.dat", &year, &author, &title; format="\"%[^\"]\" \"%[^\"]\" \"%[^\"]\"");
This current version of this function does not handle missing data.
For such files, the
csv_readcol function might be a better
By default, lines not matching the expected format are assumed to
be comments and are skipped. So normally the
qualifier is not needed. However, it is useful in conjunction with
stop_on_mismatch qualifier to force the parser to skip
lines beginning with the comment string and continue scanning.
sscanf, atof, fopen, fgets, fgetslines, csv_readcol