我试图用逗号将输入变量拆分为某些Fortran代码。变量是一个包含可变数量日期的字符串,但日期始终为DD-MMM-YYYY格式。
此类字符串的示例:
04-DEC-2015,10-DEC-2015,23-DEC-2015,25-DEC-2015
它并不总是四个日期,但它始终是该格式的11个字符的日期。
我只想在不同的行上打印这些日期;目前的代码:
write(outfile,10) ' - ', TRIM(days)
打印:
- 04-DEC-2015,10-DEC-2015,23-DEC-2015,25-DEC-2015
我想要写一些印刷品:
- '04-DEC-2015'
- '10-DEC-2015'
- '23-DEC-2015'
- '25-DEC-2015'
有没有直接的方法来做到这一点(我对Fortran很新)?我正在考虑计算字符串中逗号的数量,添加1以获取日期数,并在循环内创建一个适合每个日期的CHARACTER(11)
变量,一次从字符串中获取11个字符(跳过逗号),并以我想要的格式打印该日期。这太复杂了吗?
答案 0 :(得分:4)
正如之前所建议的那样,内部文件的列表定向读取将处理逗号分割,而不需要更多努力。对于
character(11) :: split_days(MAX_DAYS)=''
ndays = ...
read(days,*) split_days(1:ndays)
开始工作我们需要知道ndays
的价值。如果你对
ndays = (len_trim(days)+1)/12
ndays = INDEX(days,',',BACK=.TRUE)/12+1
或
ndays = COUNT([(days(i:i),i=1,LEN_DAYS)].eq.',')+1
然后一切都很好。
或者,你可以有一个可分配的数组
character(11), allocatable :: split_days(:)
ndays = ...
allocate (split_days(ndays))
read(days,*) split_days
或者,您不需要读取内部文件(列表导向或其他方式),尽管如果我信任输入数据的形式,我可能会这样做。
do i=1,MAX_DAYS
split_days(i)=days(12*(i-1)+1:)
if (INDEX(days(12*i:),',').eq.0) exit
end do
列表导向读取方法的另一种可能性是选择要读取的大数字,如果失败,请再次尝试读取更少的数字。这只有在更棘手的情况下才有意义。
最后,如果需要,你可以使用通常的数组缩小/增长技巧。
如果你刚刚在打印之后,而不是存储,那么上面的循环方法可以避免弄乱未知长度的数组:
do i=1,MAX_DAYS
print '(" - ''",A11,"''")', days(12*(i-1)+1:)
if (INDEX(days(12*i:),',').eq.0) exit
end do
答案 1 :(得分:3)
使用内部阅读。
character(len=47) :: in = '04-DEC-2015,10-DEC-2015,23-DEC-2015,25-DEC-2015'
character(len=11) :: out(4)
read(in,*)out
请注意这是在逗号上分开。如果逗号之间的字符串多于或少于11个字符,则它们将被截断或填充空白。另请注意,字符串中不能有空格,或者读取也会分开。
你需要知道要读多少。如果您知道它们都是长度为11,则可以(len(in)+1)/12
,或使用index
来计算逗号。