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

Re: Help with reading structure from file



In article <95s0c6$8ar$1@news.wrc.xerox.com>,
Surendar Jeyadev <jeyadev@wrc.xerox.com> wrote:
>In article <3A810F7C.B69C6E28@dkrz.de>,
>Martin Schultz  <martin.schultz@dkrz.de> wrote:
>>The solution is to use a structure. SOmething like this (no time for
>>testing though):
>>
>>   template = { a:'', x:fltarr(7) }
>>   result = replicate(template, NLINES)
>
>This is exactly what I tried -- see the code fragment included below.
>
>>   readf, lun, result, format='(4x,a4,7f9.3)'
>>   data = result[*].x   ; not sure if this even works ;-(
>
>No, it does not! Here is the sesssion from PV Wave:
>
>     WAVE> nsets = 108
>     WAVE> f1 = "(4x,a4,7f9.3)"
>     WAVE> dpt = { fullrow, id: ' ', x: fltarr(7) }
>     WAVE> fulldata = replicate( {fullrow}, nsets)
>     WAVE> 
>     WAVE> openr, 1, 'data'
>     WAVE> readf, 1, fulldata, format = f1
>     % End of input record encountered on file unit: 1.
>     % Execution halted at $MAIN$   (READF).
>     WAVE> 
>
>The reason is the the format statement is being ignored. The entire
>first line of data is being read as the string variable, the first
>7 fields of the *second* line are read as x, the last column of the
>second line is read as the string variable of the second element of
>the structure array ...... need I say more! This is what should happen
>is the READF did *not* have a format statement.

Sorry, that is not correct. I tried so many variations and got so
many different errors, I am all mixed up now. The problem is a really
weird one, now and I cannot figure it out.

After doing the above, .... 

WAVE> print, fulldata(0)
{ 001a      312.194      76.9220      296.301      21.4620
     0.453000      289.515    0.957000 }
WAVE> print, fulldata(1)
{ 7         0.00000      0.00000      0.00000      0.00000
      0.00000      0.00000    0.00000 }
{       0.00000      0.00000      0.00000      0.00000
      0.00000      0.00000     0.00000 }

What is going on here? The first line of data is read correctly.
Why are the second, third ..... data rows messed up? On the other
hand, line by line reading via a loop works just fine. 

>Curiously, the PV Wave manual has a very similar example with an
>unformatted read. What they do is 
>
>    fulldata = replicate( {fullrow, string(' ', format=f1),  $
>                 fltarr(7) } , nsets)
>    readu, lun, fulldata
>
>I tried this with the formatted read and it did not work. I guess
>the Excel fans have won another round :-( To avoid this, I normally
>put the string labels at the end of the data rows, but this was a
>"How will you do it fast?" challenge. 
>
>>Hope this helps you a little bit,
>>
>>Martin
> 
>Thanks for the suggestion ...
>
>Dave (or anyone else!), Any suggestion why the format is being ignored?
>
>>Surendar Jeyadev wrote:
>>> 
>>> In the loosing battle with the Excel users, the latest direct
>>>      hit was reading
>>> in a file that contained strings and numeric data in each line.
>>>      Having given
>>> up (and as the only hold out against Excel!), I need HEEELLLPPP.
>>> 
>>> This is the simplified problem. I am trying to read data in the following
>>> format:
>>> 
>>>     001a  312.194   76.922  296.301   21.462    0.453  289.515    0.957
>>>     001b  363.748  106.090  506.188   19.430    0.528  347.252    1.176
>>>     001c  398.248  138.541  724.470   17.152    0.578  383.534    1.701
>>>     002a  294.593   28.525  248.744    8.532    0.428  290.497    1.268
>>>     002b  353.415   46.290  449.015    7.974    0.513  349.565    2.011
>>>     002c  401.279   80.260  661.701    3.341    0.582  395.403    4.529
>>>     ....
>>>     ....
>>> 
>>> i.e. in the format "(4x,a4,7f9.3)". I would like it to go into a 2 dimensional
>>> structure.
>>> 
>>> I cannot find a way of reading it as a entire array. At present, all I can
>>> come up with is
>>> 
>>>       nsets = 108               ; number of lines of data
>>>       f1 = "(4x,a4,7f9.3)"
>>>       a = string(4)
>>>       y = fltarr(7)
>>>       dpt = { fullrow, id: ' ', x: fltarr(7) }
>>>       fulldata = replicate( {fullrow}, nsets)
>>> 
>>>       openr, 1, 'data'
>>>       for i=0,nsets-1 do begin
>>>           readf, 1, format = f1, a, y
>>>           fulldata(i).id = a
>>>           fulldata(i).x = y
>>>       endfor
>>>       close, 1
>>> 
>>> Is there any way of avoiding the temporary variables and the loop? I am
>>> using PV-Wave CL, Ver 6.
>>> --
>>> 
>>> Surendar Jeyadev         jeyadev@wrc.xerox.com
>>
>>-- 
>>[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
>>[[ Dr. Martin Schultz   Max-Planck-Institut fuer Meteorologie    [[
>>[[                      Bundesstr. 55, 20146 Hamburg             [[
>>[[                      phone: +49 40 41173-308                  [[
>>[[                      fax:   +49 40 41173-298                  [[
>>[[ martin.schultz@dkrz.de                                        [[
>>[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
>
>
>-- 
>
>Surendar Jeyadev         jeyadev@wrc.xerox.com


-- 

Surendar Jeyadev         jeyadev@wrc.xerox.com