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 11:36:37 +0800

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


reply via email to

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