help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: textscan wanted


From: Ben Abbott
Subject: Re: textscan wanted
Date: Thu, 21 Oct 2010 16:37:42 +0800

On Oct 21, 2010, at 11:36 AM, Ben Abbott wrote:

> On Oct 21, 2010, at 9:52 AM, Liam Groener wrote:
> 
>> On Oct 20, 2010, at 3:03 AM, Ben Abbott wrote:
>> 
>>> On Oct 20, 2010, at 1:55 PM, Ben Abbott wrote:
>>> 
>>>> On Oct 20, 2010, at 1:39 PM, Dr. Johannes Zellner wrote:
>>>> 
>>>>> 2010/10/20 Ben Abbott <address@hidden>
>>>>> On Oct 20, 2010, at 4:53 AM, Dr. Johannes Zellner wrote:
>>>>> 
>>>>>>> Hi,
>>>>>>> 
>>>>>>> I've a bunch of matlab files which use textscan.
>>>>>>> 
>>>>>>> I don't want to replace all textscan calls with something like fscanf 
>>>>>>> but I'd rather like to have an octave function which implements 
>>>>>>> textscan().
>>>>>>> 
>>>>>>> Does anyone have a textscan implementation?
>>>>>>> 
>>>>>>> regards,
>>>>>>> 
>>>>>>> --
>>>>>>> Johannes.
>>>>>> 
>>>>>> I've opened a ticket in the bug tracker.
>>>>>> 
>>>>>>    https://savannah.gnu.org/bugs/index.php?31380
>>>>>> 
>>>>>> For now, have you looked at using textread() instead? Unfortunately, 
>>>>>> textread() is not fully compatible with the ML version.
>>>>>> 
>>>>>> The syntax for ML's textscan is ...
>>>>>> 
>>>>>> C = textscan (fid, 'format')
>>>>>> C = textscan (fid, 'format', N)
>>>>>> C = textscan (fid, 'format', 'param', value)
>>>>>> C = textscan (fid, 'format', N, 'param', value)
>>>>>> C = textscan (str, ...)
>>>>>> [C, position] = textscan (...)
>>>>>> 
>>>>>> If you don't require the input "N", it should be straight forward to 
>>>>>> modify scantext() to implement textscan(). A quick fix would support the 
>>>>>> limited syntax below.
>>>>>> 
>>>>>> C = textscan (fid, 'format')
>>>>>> C = textscan (fid, 'format', 'param', value)
>>>>>> C = textscan (str, ...)
>>>>>> 
>>>>>> Would that be useful to you?
>>>>>> 
>>>>>> Ben
>>>>> 
>>>>> Ben,
>>>>> 
>>>>> thanks for the quick response.
>>>>> It would be more useful, if it would also allow the input parameter N.
>>>>> 
>>>>> regards,
>>>> 
>>>> Ok. Can you provide a simple example with both an input file and a script 
>>>> that uses textscan() with the parameter N to read some data?
>>>> 
>>>> Ben
>>> 
>>> I found some simple examples on the web, and made an attempt at 
>>> implementing the function.
>>> 
>>> I'd appreciate it if you can try the attached textscan.m and let us know if 
>>> it works for you.
>>> 
>>> Ben
>>> 
>>> <textscan.m>
>> 
>> Hi Ben,
>> 
>> I downloaded the textscan.m and strread.m from your emails and tried the 
>> following simple script from a Matlab book using Octave 3.2.3:
>> 
>> B = [30 40 60 70];
>> fid = fopen('myoutput','w');
>> fprintf(fid,'%g miles/hr = %g kilometers/hr\n',[B;8*B/5]);
>> fclose(fid);
>> 
>> fopen('myoutput','r');
>> X = fscanf(fid,'%f miles/hr = %f kilometers/hr')
>> C = textscan(fid,'%f miles/hr = %f kilometers/hr')
>> fclose(fid);
>> 
>> This was the output:
>> 
>> X =
>> 
>>   30
>>   48
>>   40
>>   64
>>   60
>>   96
>>   70
>>  112
>> 
>> error: A(I): Index exceeds matrix dimension.
>> error: called from:
>> error:   /Users/liamg/mFiles/textscan.m at line 60, column 3
>> error:   /Users/liamg/mFiles/tst.m at line 8, column 3
>> 
>> The file "myoutput" was written correctly.
>> 
>> Liam
> 
> 
> I tried the example above in Matlab. The result for C was ...
> 
> C =   [0x1 double]    [0x1 double]
> 
> If I commend out "X = fscan (...)" then I get
> 
> C =   [4x1 double]    [4x1 double]
> 
>>> C{1}
> 
> ans =
> 
>    30
>    40
>    60
>    70
> 
>>> C{2}
> 
> ans =
> 
>    48
>    64
>    96
>   112
> 
> I modified the example as ...
> 
> B = [30 40 60 70];
> fid = fopen ('myoutput','w');
> fmt = '%g miles/hr = %g kilometers/hr\n';
> str = sprintf (fmt, [B;8*B/5]);
> fprintf (fid, '%s', str);
> fclose (fid);
> 
> fopen ('myoutput','r');
> fmt = '%f miles/hr = %f kilometers/hr';
> C = textscan (fid, fmt);
> fclose (fid);
> 
> c = cell (1, 2);
> [c{:}] = strread (str, fmt);
> 
> With ML, both textscan() and strread() give the same result.
> 
>> From that I infer that the problem is with strread(). I'll take a look at 
>> fixing that.
> 
> Ben

I've attached updated versions of strread.m and textscan.m

If the format includes regular expressions then these won't work. Otherwise, 
the should be ok.

If no problems are found, I'll move this thread to the developers list.

Ben

Attachment: strread.m
Description: Binary data

Attachment: textscan.m
Description: Binary data






reply via email to

[Prev in Thread] Current Thread [Next in Thread]