forums.silverfrost.com Forum Index forums.silverfrost.com
Welcome to the Silverfrost forums
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Data representation in an array format

 
Post new topic   Reply to topic    forums.silverfrost.com Forum Index -> Support
View previous topic :: View next topic  
Author Message
kingkastle



Joined: 22 May 2008
Posts: 20

PostPosted: Fri Jun 27, 2008 12:47 pm    Post subject: Data representation in an array format Reply with quote

Hi,

I can´t find a solution for the following:

I´m working with a fortran 95 that generates a file in which the result is a file with 48 datas presented in a (7X7) Matrix. The point is: I would like to get this datas in just an array for representing it in Excel. I can see in the fortran code that the write statment is presented in this way:

open(10, file="C:\Documents and Settings\MARCAL\Escritorio\Grafics.txt")

write(10, *) "Forecast:"
write(10, *) Frct(1:siz)
write(10, *) "Observation:"
write(10, *) Obs(1:siz)

close (10)

I have tried to short this out by myself but I can´t find the solution, would anyone mind to tell me how to write the format in order to get the datas presented in just an array???

PD: I use Excel to represent datas, because the use of macros and so, but there is any other better program for representing purposes?? thanks

Thanks very much in advance
BR
Back to top
View user's profile Send private message Send e-mail
Wilfried Linder



Joined: 14 Nov 2007
Posts: 314
Location: Düsseldorf, Germany

PostPosted: Mon Jun 30, 2008 10:59 am    Post subject: Reply with quote

Hi kingkastle,

I'm not sure if I can help you. If you want to use data in Excel, it might be good to store them in the CSV format which can directly be used in that software. Here comes a little example:

character*100 string

c string must be terminated by zero

string = ' No. 1 ; No. 2 ; No. 3 ; No. 4 '
string(52:52) = char(0)
write(20,'(A)',err=100)string(1:52)

write(string( 1:12),'(F12.3)',err=100)frct(1)
write(string(14:25),'(F12.3)',err=100)frct(2)
write(string(27:38),'(F12.3)',err=100)frct(3)
write(string(40:51),'(F12.3)',err=100)frct(4)
write(20,'(A)',err=100)string(1:52)

write(string( 1:12),'(F12.3)',err=100)obs(1)
write(string(14:25),'(F12.3)',err=100)obs(2)
write(string(27:38),'(F12.3)',err=100)obs(3)
write(string(40:51),'(F12.3)',err=100)obs(4)
write(20,'(A)',err=100)string(1:52)

100 close(20)

Write all data belonging to one "row" like the Forecast and the Observation you mentioned. The first line of the output file contains the field names (in my example No. 1, No. 2 ...). Make sure that the output string is one character longer then needed, and terminate the string with zero. Store the file with the extension CSV.

Regards
Wilfried
Back to top
View user's profile Send private message
IanLambley



Joined: 17 Dec 2006
Posts: 490
Location: Sunderland

PostPosted: Mon Jun 30, 2008 12:41 pm    Post subject: Reply with quote

Don't forget that Excel comma separated files require a full stop decimal point and a comma between variables, if your Windows International settings specify the British/american method. For continental Europe, the decimal point is a comma and the comma separator becomes a semi-colon.
FTN95 always uses a full stop as the decimal, unless someone wants to tell me otherwise. The alternate method is to use a tab delimited text file, but you will probably still have to make the conversion for the decimal point.

Typically, you could use the following for tab delimited:


Code:

character*1 separator,from_decimal_point, to_decimal_point
character*20 format_string
character*2000 big_output_buffer
separator                = char(9)
from_decimal_point = '.'
to_decimal_point     = ','
big_output_buffer    = ' '
format_string='(f12.3,a)'
write(big_output_buffer,format_string)(frct(i),separator,i=1,siz)
ilen=leng(big_output_buffer)
do i=1,ilen
  if(big_output_buffer(i:i) .eq. from_decimal_point )then
    big_output_buffer(i:i) = to_decimal_point
  endif
enddo
write(1000)trim(big_output_buffer)
1000 format(a)
end


If you wish to make this a bit more general, then a translation subroutine would do the trick, i.e.

Code:

subroutine translate_specific_characters(string,from,to)
character*(*) string,from,to
! "from" and "to" must be the same length and have a one to one
! translation relationship
if(from .eq. to)return
ilen = leng(string)
do i=1,ilen
  iposition = index(from,string(i:i))
  if(iposition .gt. 0)then
   string(i:i) = to(iposition:iposition)
  endif
enddo
end


and the main program would become:

Code:

character*1 separator
character*2 translate_from, translate_to
character*20 format_string
character*2000 big_output_buffer
translate_from = '.,'
translate_to     = ',;'
big_output_buffer    = ' '
format_string='(f12.3,a)'
write(big_output_buffer,format_string)(frct(i),separator,i=1,siz)
call translate_specific_characters(big_output_buffer,translate_from,translate_to)

write(1000)trim(big_output_buffer)
1000 format(a)
end


The above program starts with the default British/american setup and translates to the European style. The translate_from and translate_to strings could be set at program start-up. If they are identical, then no translation is carried out. Note this suggestion leaves an extra separator on the right hand end of the string, which will probably not matter, but is easily removed before translation with:

Code:

ilen=leng(big_output_buffer)
big_output_buffer(ilen:) = ' '


Note if you are mixing text and numerics, then in a CSV file, if the text includes the separator, then the string is surrounded in quotes, and a slightly more complicated translation routine is required that determines whether you are within quotes or not, e.g. the translation routine becomes:

Code:

subroutine translate_specific_characters(string,from,to)
character*(*) string,from,to
! "from" and "to" must be the same length and have a one to one
! translation relationship
if(from .eq. to)return
ilen = leng(string)
in_quote = 0
do i=1,ilen
!toggle quotation status
  if(string(i:i) .eq. '"')in_quote = 1 - in_quote
  if(in_quote .eq. 0)then
    iposition = index(from,string(i:i))
    if(iposition .gt. 0)then
     string(i:i) = to(iposition:iposition)
    endif
  endif
enddo
end




Regards

Ian
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic    forums.silverfrost.com Forum Index -> Support All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group