[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