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

Home » Public Forums » archive » FORMAT codes and tabs
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
FORMAT codes and tabs [message #15373] Mon, 10 May 1999 00:00 Go to next message
ashmall is currently offline  ashmall
Messages: 14
Registered: October 1998
Junior Member
Dear All,

I'm having trouble reading in a text file with dates and times in the
form:
11/10/99<tab><sp>16<sp>:<sp>47
where <tab> and <sp> represent tabs and spaces.
Sometimes the day/months are consist of only 1 char (e.g. 3/4/99). I
can write a separate FORMAT statement for each case but when I try to
use I0 to deal with both cases it doesn't work and it seems to be due
to the TAB char.
Am I just being foolish or what?
The following short program might hepl explain. I'm using IDL 5.2
under NT4.0.

Cheers,

Justin

pro test_read

;Create a Tab character
tab = STRING(9B)
;Create 2 lines of dummy input
line1 = '10/11/99' + tab + ' 19 : 42'
line2 = '1/3/99' + tab + ' 19 : 42'

;This format works for days/months with 2 digits
READS, line1, FORMAT='(I2,x,I2,x,I2,2x,I2,3x,I2)', dd,mm,yy,hh,mn
print, dd,mm,yy,hh,mn

;This format works for days/months with 1 digit
READS, line2, FORMAT='(I1,x,I1,x,I2,2x,I2,3x,I2)', d,m,yy,hh,mn
print, d,m,yy,hh,mn

;How to use the same format code for both line1 and line2?
;Presumably need to use I0 to automatically adjust to different
;widths.

;Just trying to read in the first 3 numbers (the date)
READS, line1, FORMAT='(I0,x,I0)', dd,mm ;This works
print, dd,mm
READS, line1, FORMAT='(I0,x,I0,x,I0)', dd,mm,yy ;This DOESN'T work
READS, line1, FORMAT='(I0,x,I0,x,I2)', dd,mm,yy ;This DOESN'T work
;Is there something strange going on with the tab character?

end
Re: FORMAT codes and tabs [message #15407 is a reply to message #15373] Fri, 14 May 1999 00:00 Go to previous message
Justin Ashmall is currently offline  Justin Ashmall
Messages: 15
Registered: May 1999
Junior Member
Thanks very much for the effort - it certainly looks like you got the
answer.
I think my best bet would be to read the line into a string, replace all the
slashes with spaces and then use a single format, along the lines of

b_line = BYTE(line)
list = WHERE(b_line EQ (BYTE("/"))[0], count)
if count GT 0 then b_line[list]=(BYTE(" "))[0]
line = STRING(b_line)

Then use a general FORMAT statement with "I0"'s.
However I've not tried that yet!

Thanks again,

Justin.

Steven Thiel <beorabor@bemail.com> wrote in message
news:373B0402.E4155882@bemail.com...
> J. Ashmall:
>
> I think I know why IDL is behaving as it is, but really don't have an
> answer to how you can read both types of lines using the same format
> code. I entered a few commands at the command prompt:
> --
> IDL> line1 = '10/11/99' + STRING(9b) + ' 19 : 42'
> IDL> READS, line1, FORMAT='(I0,x,I0)', dd,mm
> IDL> help, dd, mm
> DD INT = 10
> MM INT = 19
> --
> This format does give us back two integers, but they are the wrong ones.
> We get back the 10 from the date and the 19 from the time. When you use
> the format code I0, IDL differentiates the elements to be read using
> white space. It applies the code I0 to the first element it finds- in
> this case this is '10/11/99'. If you tell IDL to FIX this string, you
> get:
> ---
> DL> HELP, FIX('10/11/99')
> <Expression> INT = 10
> ---
> After reading the '10/11/99', IDL moves on to the next element. In this
> case, it is the '19'. If we try and read in all elements, we get the
> following:
> ---
> IIDL> READS, line1, FORMAT='(I0,x,I0,x,I0)', dd,mm,yy
> % Unable to apply format code I to input: ": 42".
> % Execution halted at: $MAIN$
> ---
> After reading the first two elements, it moves on to the third- ': 42'.
> This one it cannot convert to the input format of integer:
> ---
> IDL> HELP, FIX(': 42')
> % Type conversion error: Unable to convert given STRING to Integer.
> % Detected at: $MAIN$
> <Expression> INT = 0
> ---
> Because you have other string characters in your input (the '/'), I don't
> really know how you would go about finding a general input format code.
> My suggestion would be to just read the whole thing in as a string,
> STRCOMPRESS it and STR_SEP it by single spaces. You will end up with an
> array that has the date as the first element, the hour as the second
> element, a ':' as the third and the minutes as the last. I know this
> will require more processing and isn't very clean, but I don't know of
> any other solution. I would be interested to know if someone does figure
> this out.
>
> Hope this helps.
>
> S.Thiel
> beorabor@bemail.com
> ------------------
Re: FORMAT codes and tabs [message #15427 is a reply to message #15373] Thu, 13 May 1999 00:00 Go to previous message
Steven Thiel is currently offline  Steven Thiel
Messages: 4
Registered: July 1996
Junior Member
J. Ashmall:

I think I know why IDL is behaving as it is, but really don't have an
answer to how you can read both types of lines using the same format
code. I entered a few commands at the command prompt:
--
IDL> line1 = '10/11/99' + STRING(9b) + ' 19 : 42'
IDL> READS, line1, FORMAT='(I0,x,I0)', dd,mm
IDL> help, dd, mm
DD INT = 10
MM INT = 19
--
This format does give us back two integers, but they are the wrong ones.
We get back the 10 from the date and the 19 from the time. When you use
the format code I0, IDL differentiates the elements to be read using
white space. It applies the code I0 to the first element it finds- in
this case this is '10/11/99'. If you tell IDL to FIX this string, you
get:
---
DL> HELP, FIX('10/11/99')
<Expression> INT = 10
---
After reading the '10/11/99', IDL moves on to the next element. In this
case, it is the '19'. If we try and read in all elements, we get the
following:
---
IIDL> READS, line1, FORMAT='(I0,x,I0,x,I0)', dd,mm,yy
% Unable to apply format code I to input: ": 42".
% Execution halted at: $MAIN$
---
After reading the first two elements, it moves on to the third- ': 42'.
This one it cannot convert to the input format of integer:
---
IDL> HELP, FIX(': 42')
% Type conversion error: Unable to convert given STRING to Integer.
% Detected at: $MAIN$
<Expression> INT = 0
---
Because you have other string characters in your input (the '/'), I don't
really know how you would go about finding a general input format code.
My suggestion would be to just read the whole thing in as a string,
STRCOMPRESS it and STR_SEP it by single spaces. You will end up with an
array that has the date as the first element, the hour as the second
element, a ':' as the third and the minutes as the last. I know this
will require more processing and isn't very clean, but I don't know of
any other solution. I would be interested to know if someone does figure
this out.

Hope this helps.

S.Thiel
beorabor@bemail.com
------------------
Justin Ashmall wrote:

> Dear All,
>
> I'm having trouble reading in a text file with dates and times in the
> form:
> 11/10/99<tab><sp>16<sp>:<sp>47
> where <tab> and <sp> represent tabs and spaces.
> Sometimes the day/months are consist of only 1 char (e.g. 3/4/99). I
> can write a separate FORMAT statement for each case but when I try to
> use I0 to deal with both cases it doesn't work and it seems to be due
> to the TAB char.
> Am I just being foolish or what?
> The following short program might hepl explain. I'm using IDL 5.2
> under NT4.0.
>
> Cheers,
>
> Justin
>
> pro test_read
>
> ;Create a Tab character
> tab = STRING(9B)
> ;Create 2 lines of dummy input
> line1 = '10/11/99' + tab + ' 19 : 42'
> line2 = '1/3/99' + tab + ' 19 : 42'
>
> ;This format works for days/months with 2 digits
> READS, line1, FORMAT='(I2,x,I2,x,I2,2x,I2,3x,I2)', dd,mm,yy,hh,mn
> print, dd,mm,yy,hh,mn
>
> ;This format works for days/months with 1 digit
> READS, line2, FORMAT='(I1,x,I1,x,I2,2x,I2,3x,I2)', d,m,yy,hh,mn
> print, d,m,yy,hh,mn
>
> ;How to use the same format code for both line1 and line2?
> ;Presumably need to use I0 to automatically adjust to different
> ;widths.
>
> ;Just trying to read in the first 3 numbers (the date)
> READS, line1, FORMAT='(I0,x,I0)', dd,mm ;This works
> print, dd,mm
> READS, line1, FORMAT='(I0,x,I0,x,I0)', dd,mm,yy ;This DOESN'T work
> READS, line1, FORMAT='(I0,x,I0,x,I2)', dd,mm,yy ;This DOESN'T work
> ;Is there something strange going on with the tab character?
>
> end
  Switch to threaded view of this topic Create a new topic Submit Reply
Previous Topic: CALL_EXTERNAL on Debian Linux
Next Topic: Special Characters

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

Current Time: Wed Oct 08 15:47:53 PDT 2025

Total time taken to generate the page: 0.00619 seconds