Read data file containing fractional numbers?



Hi Paul,

I only can guess what you're trying to do here.

It seems to me that the result of splitting is not what you want and in the
end the parser complains. The parser needs a string which contains a valid
Maxima expression. An example:

(%i1) stringdisp:true$

(%i2) string: "10.2; sqrt(1.44); if true then x; foo+foo";
(%o2)             "10.2; sqrt(1.44); if true then x; foo+foo"
(%i3) strings: split(string,";");
(%o3)       ["10.2", " sqrt(1.44)", " if true then x", " foo+foo"]
(%i4) expressions: map(parse_string, strings);
(%o4)                 [10.2, 1.2, if true then x, 2 foo]
(%i5) ''expressions;
(%o5)                        [10.2, 1.2, x, 2 foo]

Comments:

split(string) would split at blanks (the default). This wouldn't fit in case
of expressions which contain e.g. operators and arguments and of course
blanks itself.
split(string, delimiter) allows to define other delimiters, e.g. ";" or ","
or ...

The parsed expressions are simplified but not evaluated . If you want
evaluation you can use ev or '' (2 quotes) or the eval_string function.

Hope this helps

Volker

2011/5/22 Paul Bowyer <pbowyer at olynet.com>

> On 05/21/2011 06:14 PM, Paul Bowyer wrote:
>
>> On 05/21/2011 02:23 PM, Edwin Woollett wrote:
>>
>>> trying to include the opening (and closing? )
>>> of the requested data file inside a block
>>> structure,  and getting errors, as in:
>>> ======================
>>> Maxima 5.24.0 http://maxima.sourceforge.net
>>> using Lisp GNU Common Lisp (GCL) GCL 2.6.8 (a.k.a. GCL)
>>> Distributed under the GNU Public License. See the file COPYING.
>>> Dedicated to the memory of William Schelter.
>>> The function bug_report() provides bug reporting information.
>>>                                 2011-05-21
>>>
>>>
>>> (%i1) load(read_data1);
>>> (%o1)                       c:/work2/read_data1.mac
>>> (%i2) fundef (read_data1);
>>> (%o2) read_data1(%filename) := block([%s, %r],
>>> if not file_search(%filename) then (disp(" file not found "),
>>> return(false)),
>>> %s : openr(%filename), %r : [], while (l : readline(s)) # false do r :
>>> cons(map(parse_string, split(l)), r), reverse(%r))
>>> (%i3) read_data1("mydata1.dat");
>>> readline: argument must be a stream.
>>> #0: read_data1(%filename=mydata1.dat)(read_data1.mac line 13)
>>> -- an error. To debug this try: debugmode(true);
>>> ==========================
>>> lines 13 and 14 of the data file are :
>>>
>>> while (l : readline(s)) # false do
>>>           ( r : cons (map(parse_string, split(l)), r)),
>>> ==============================
>>> So the file hasn't been opened for reading by
>>> my code?
>>>
>>>
>>> Ted
>>>
>>>
>>> _______________________________________________
>>> Maxima mailing list
>>> Maxima at math.utexas.edu
>>> http://www.math.utexas.edu/mailman/listinfo/maxima
>>>
>>>  Hi Ted:
>>
>> I changed your syntax slightly to add some missing % chars and got it to
>> work with this:
>> read_data1(%filename) := block([%s, %r],
>>  if not file_search(%filename) then
>>     (disp(" file not found "), return(false)),
>>  %s : openr(%filename),
>>  %r : [],
>>  while (l : readline(%s)) # false do
>>   %r : cons(map(parse_string, split(l)), %r),
>>   reverse(%r)
>> );
>>
>> I called it with:
>> read_data1("/home/pfb/mydata1.dat");
>>
>> But, when I include more than just simple data in the data file, it
>> chokes:
>>
>> If mydata1.dat contains (No newlines in long expression ):
>> 10.3
>> 14.4
>> read_data1(%filename) := block([%s, %r],if not file_search(%filename) then
>> (disp(" file not found "), return(false)),  %s : openr(%filename),  %r : [],
>>  while (l : readline(%s)) # false do   %r : cons(map(parse_string,
>> split(l)), %r),   reverse(%r));
>> 12.6
>> 14.5
>> It gives this error:
>> stdin:2:incorrect syntax: := is not a prefix operator
>>
>> If mydata1.dat contains (No newlines in long expression -- copy pasted
>> from fundef (read_data1) output):
>> 10.3
>> 14.4
>> read_data1(%filename):=block([%s,%r],if notfile_search(%filename) then
>> (disp(" file not found "),return(false)) ,%s:openr(%filename),%r:[],while
>> (l:readline(%s))#false do
>> %r:cons(map(parse_string,split(l)),%r),reverse(%r));
>> 12.6
>> 14.5
>> It gives this error:
>> stdin:40:incorrect syntax: Premature termination of input at $.
>>
>> If mydata1.dat contains (No newlines in long expression, quoted
>> expression, and escaped " chars):
>> 10.3
>> 14.4
>> "read_data1(%filename):=block([%s,%r],if notfile_search(%filename) then
>> (disp(\" file not found \"),return(false)) ,%s:openr(%filename),%r:[],while
>> (l:readline(%s))#false do
>> %r:cons(map(parse_string,split(l)),%r),reverse(%r));"
>> 12.6
>> 14.5
>> It gives this error, which seems to say it got past readline, but now
>> chokes at parsing:
>> Maxima encountered a Lisp error:
>>
>> Error in function PEEK-ONE-TOKEN-G:
>>   parser: end of file while scanning expression.
>> Automatically continuing.
>> To enable the Lisp debugger set *debugger-hook* to nil.
>>
>>
>> If mydata1.dat contains:
>> 10.3
>> 14.4
>> 12.6
>> 14.5
>> it works fine.
>>
>> It looks like you need to quote your expressions and then pre-process them
>> them before your run them into the parser, but I'm uncertain if that's true.
>>
>> Paul
>> _______________________________________________
>> Maxima mailing list
>> Maxima at math.utexas.edu
>> http://www.math.utexas.edu/mailman/listinfo/maxima
>>
>>  Hi again Ted:
>
> I fiddled with this a little more this morning when I had some time so I
> could understand what's happening.
>
> Part of the problem last night was there wasn't a closing of the stream, so
> maxima kept opening new steams each time I ran the function.
>
> I modified it again like this to break out the various parts and add a
> close statement:
>
> read_data1(%filename) := block([%s, %r],
>  if not file_search(%filename) then
>     (disp(" file not found "), return(false)),
>  %s : openr(%filename),
>  %r : [],
>  while (l : readline(%s)) # false do
>  (
>   /*%r : cons(map(parse_string, split(l)), %r),*/
>   %r : l,
>   %r : split (%r),
>   %r : parse_string ( %r ), /*chokes here. Need something different!*/
>   disp( %r )
>   /*reverse(%r)*/
>  ),
>  close(%s)
> );
>
> mydata1.dat contains (unquoted and without newlines in long expression, but
> with internal spaces):
>
> 10.3
> 14.4
> read_data1(%filename):=block([%s,%r],if notfile_search(%filename) then
> (disp(" file not found "),return(false)) ,%s:openr(%filename),%r:[],while
> (l:readline(%s))#false do
> %r:cons(map(parse_string,split(l)),%r),reverse(%r))
> 12.6
> 14.5
>
> called as:
>
> read_data1("/home/pfb/mydata1.dat");
>
> and the output was:
> parse_string: ["10.3"] is not a string.
> #0: read_data1(%filename=/home/pfb/mydata1.dat)
>
>  -- an error. To debug this try: debugmode(true);
>
> Paul
>
>
> _______________________________________________
> Maxima mailing list
> Maxima at math.utexas.edu
> http://www.math.utexas.edu/mailman/listinfo/maxima
>