1

我正在尝试读取一个看起来像这样的数据集

DATE,TIME,val
1/1/2001,1:00:00,0

与程序

program main
implicit none

real :: val
character(len=8) :: date
character(len=7) :: time
open(1,file='data.csv',status='old')
read(1,*) ! header
read(1,fmt=100)date,time,val
100 FORMAT (A,1x,A,1x,F3.1)
end program

如果日期和时间总是有 8 个或 7 个字符但它们没有,这一切都很好

 4/21/2001,19:00:00,0

我应该如何声明 fortran 的格式以读取示例中的日期、时间、val 行?

谢谢

4

2 回答 2

7

您可以将所有整data, time, value行读入一个字符串,然后对其进行处理以提取各个元素,类似于

program main
implicit none

real :: val
character(len=10) :: date
character(len=8) :: time

character(len=100) :: line
integer :: n1, n2, end

open(1, file='data.csv', status='old')

! Read entire second line into `line`, ignoring the header
read(1,*) ! header
read(1,'(A100)') line

! Determine locations of the first and last comma in `line` and the
! end of the line:
n1  = index(line, ',')
n2  = index(line, ',', back=.True.)
end = len_trim(data)

! Split line up according to position of commas and assign to 
! appropriate variables
date = data(1:n1-1)
time = data(n1+1:n2-1)
read(data(n2+1:end), *) val ! Internal read, for converting from string to float

end program main

请注意,这对问题中的示例数据高度专业化,但概括此代码应该不会太难。

于 2012-07-03T13:42:35.053 回答
0

您尚未定义您正在使用的“数据”变量。该解决方案的另一个问题是,现在您将所有变量都作为字符卡住了,这可能对分析没有用处。

于 2013-11-20T22:43:08.567 回答