readascii SYNOPSIS Read data from a text file USAGE Int_Type readascii (file, &v1,...&vN ; qualifiers) DESCRIPTION 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 specified variables `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, a `File_Type' object representing an open file pointer, or an array of lines to be scanned. QUALIFIERS 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. EXAMPLE As a simple example, consider a file called `imped.dat' containing # Distance Zr Zi 0.0 50.2 0.1 1.0 47.3 -12.2 2.0 43.9 -15.8 The 3 columns may be read and stored in the variables `x', `zr', `zi' using n = readascii ("imped.dat", &x, &zr, &zi); After return, The value of `x' will be set to `[0.0,1.0,2.0]', `zr' to `[50.2,47.3,43.9]', `zi' to `[0.1,-12.2,-15.8]', and `n' to 3. Another way to read the same data is to use n = readascii ("imped.dat", &data; ncols=3); In this case, `data' will be `Array_Type[3]', with each element of the array containing the array of data values for the corresponding column. As before, `n' will be 3. As a more complex example, Consider a file called `score.dat' that contains: 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 This file may be read using n = readascii ("score.dat", &name, &score, &date, &flags; format="%s %lf %s %d"); In this case, `n' will be 3, `name' and `date' will be String_Type arrays, `score' will be a Double_Type array, and `flags' will be an `Int_Type' array. Now suppose that only the score and flags column are of interest. The `name' and `date' fields may be ignored using n = readascii ("score.dat", &score, &flags"; format="%*s %lf %*s %d"); Here, `%*s' indicates 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: # Year Author Title "1605" "Miguel de Cervantes" "Don Quixote de la Mancha" "1885" "Mark Twain" "The Adventures of Huckleberry Finn" "1955" "Vladimir Nabokov" "Lolita" Such a file may be read using n = readascii ("books.dat", &year, &author, &title; format="\"%[^\"]\" \"%[^\"]\" \"%[^\"]\""); NOTES This current version of this function does not handle missing data. For such files, the `csv_readcol' function might be a better choice. By default, lines not matching the expected format are assumed to be comments and are skipped. So normally the `comment' qualifier is not needed. However, it is useful in conjunction with the `stop_on_mismatch' qualifier to force the parser to skip lines beginning with the comment string and continue scanning. SEE ALSO sscanf, atof, fopen, fgets, fgetslines, csv_readcol --------------------------------------------------------------