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