comp.lang.idl-pvwave archive
Messages from Usenet group comp.lang.idl-pvwave, compiled by Paulo Penteado

Home » Public Forums » archive » reading file into structure?
Show: Today's Messages :: Show Polls :: Message Navigator
E-mail to friend 
Switch to threaded view of this topic Create a new topic Submit Reply
reading file into structure? [message #24822] Wed, 18 April 2001 05:58 Go to next message
Randall Skelton is currently offline  Randall Skelton
Messages: 169
Registered: October 2000
Senior Member
Hi all,

I am having a rather silly problem with reading in a simple ASCII file
directly into an IDL structure. Below is a simple procedure
'testread' and a sample ASCII file 'testfile'. NB: I've removed all the
error checking and striped down the procedure to limit its size...

What I want to do is read in data on line 20 directly into the data.values
but for some reason all I get are zeros in the 'values' array. If I read
the data directly into a float array, there is no problem? I am at a loss
here?

pro testread, file, data
sgas = '*TEST'
l = STRLEN(sgas)
OPENR, 1, file
header = '!'
nlev = 0

WHILE STRMID(header,0,1) EQ '!' DO READF, 1, header
READS, header, nlev

;data = fltarr(nlev) ;change comments if testing array
data = {basic_struct, comment: ' ', values: fltarr(nlev)}

WHILE STRMID(header,0,l) NE sgas DO BEGIN
READF, 1, header
IF STRLEN(header) LT l THEN header = header + ' '
header = STRUPCASE(header)
ENDWHILE
;READF, 1, data ;<-- this works.
READF, 1, data.values ;<-- why doesn't this work?
CLOSE, 1
END

-------------- testfile -------------
! Comments here
! Another line of comments
50
*blah [units]
0.0, 1.0, 2.0, 3.0, 4.0,
5.0, 6.0, 7.0, 8.0, 9.0,
10.0, 11.0, 12.0, 13.0, 14.0,
15.0, 16.0, 17.0, 18.0, 19.0,
20.0, 21.0, 22.0, 23.0, 24.0,
25.0, 27.5, 30.0, 32.5, 35.0,
37.5, 40.0, 42.5, 45.0, 47.5,
50.0, 55.0, 60.0, 65.0, 70.0,
75.0, 80.0, 85.0, 90.0, 95.0,
100.0, 105.0, 110.0, 115.0, 120.0
*nextblah [units]
1.013E+03, 8.988E+02, 7.950E+02, 7.012E+02, 6.166E+02,
5.405E+02, 4.722E+02, 4.111E+02, 3.565E+02, 3.080E+02,
2.650E+02, 2.270E+02, 1.940E+02, 1.658E+02, 1.417E+02,
1.211E+02, 1.035E+02, 8.850E+01, 7.565E+01, 6.467E+01,
5.529E+01, 4.729E+01, 4.047E+01, 3.467E+01, 2.972E+01,
2.549E+01, 1.743E+01, 1.197E+01, 8.010E+00, 5.746E+00,
4.150E+00, 2.871E+00, 2.060E+00, 1.491E+00, 1.090E+00,
7.978E-01, 4.250E-01, 2.190E-01, 1.090E-01, 5.220E-02,
2.400E-02, 1.050E-02, 4.460E-03, 1.840E-03, 7.600E-04,
3.200E-04, 1.450E-04, 7.100E-05, 4.010E-05, 2.540E-05
*TEST [md]
288.20, 281.70, 275.20, 268.70, 262.20,
255.70, 249.20, 242.70, 236.20, 229.70,
223.30, 216.80, 216.70, 216.70, 216.70,
216.70, 216.70, 216.70, 216.70, 216.70,
216.70, 217.60, 218.60, 219.60, 220.60,
221.60, 224.00, 226.50, 230.00, 236.50,
242.90, 250.40, 257.30, 264.20, 270.60,
270.70, 260.80, 247.00, 233.30, 219.60,
208.40, 198.60, 188.90, 186.90, 188.40,
195.10, 208.80, 240.00, 300.00, 360.00
*lastblah [units]
7.745E+03, 6.071E+03, 4.631E+03, 3.182E+03, 2.158E+03,
1.397E+03, 9.254E+02, 5.720E+02, 3.667E+02, 1.583E+02,
6.996E+01, 3.613E+01, 1.906E+01, 1.085E+01, 5.927E+00,
5.000E+00, 3.950E+00, 3.850E+00, 3.825E+00, 3.850E+00,
3.900E+00, 3.975E+00, 4.065E+00, 4.200E+00, 4.300E+00,
4.425E+00, 4.575E+00, 4.725E+00, 4.825E+00, 4.900E+00,
4.950E+00, 5.025E+00, 5.150E+00, 5.225E+00, 5.250E+00,
5.225E+00, 5.100E+00, 4.750E+00, 4.200E+00, 3.500E+00,
2.825E+00, 2.050E+00, 1.330E+00, 8.500E-01, 5.400E-01,
4.000E-01, 3.400E-01, 2.800E-01, 2.400E-01, 2.000E-01
-------------- EOF -------------
Re: reading file into structure? [message #24823 is a reply to message #24822] Wed, 18 April 2001 06:41 Go to previous message
Randall Skelton is currently offline  Randall Skelton
Messages: 169
Registered: October 2000
Senior Member
Appending to my previous query, a quick work-around seems to be to read
the file into an array and then define data.values to point to the
array. This seems a little dirty?

i.e.

pro testread, file, data
sgas = '*TEST'
l = STRLEN(sgas)
OPENR, 1, file
header = '!'
nlev = 0

WHILE STRMID(header,0,1) EQ '!' DO READF, 1, header
READS, header, nlev

array = fltarr(nlev)
data = {basic_struct, comment: ' ', values: fltarr(nlev)}

WHILE STRMID(header,0,l) NE sgas DO BEGIN
READF, 1, header
IF STRLEN(header) LT l THEN header = header + ' '
header = STRUPCASE(header)
ENDWHILE
READF, 1, array
data.values = array ; <-- dirty cheat
CLOSE, 1
END


> pro testread, file, data
> sgas = '*TEST'
> l = STRLEN(sgas)
> OPENR, 1, file
> header = '!'
> nlev = 0
>
> WHILE STRMID(header,0,1) EQ '!' DO READF, 1, header
> READS, header, nlev
>
> ;data = fltarr(nlev) ;change comments if testing array
> data = {basic_struct, comment: ' ', values: fltarr(nlev)}
>
> WHILE STRMID(header,0,l) NE sgas DO BEGIN
> READF, 1, header
> IF STRLEN(header) LT l THEN header = header + ' '
> header = STRUPCASE(header)
> ENDWHILE
> ;READF, 1, data ;<-- this works.
> READF, 1, data.values ;<-- why doesn't this work?
> CLOSE, 1
> END

[snip]
  Switch to threaded view of this topic Create a new topic Submit Reply
Previous Topic: Re: something like perl's 'require 5.4'
Next Topic: Setting up offsets array ...

-=] Back to Top [=-
[ Syndicate this forum (XML) ] [ RSS ] [ PDF ]

Current Time: Fri Oct 10 06:47:46 PDT 2025

Total time taken to generate the page: 1.67993 seconds