如何在Fortran中读取我的csv文件?

如何在Fortran中读取我的csv文件?,csv,fortran,Csv,Fortran,如何在Fortran中读取以下数据。我无法读取此文件中的数据。我有以下错误 severe (64): input conversion error, unit 18 Image PC Routine Line Source a.out 00000000004734AA Unknown Unknown Unknown 这

如何在Fortran中读取以下数据。我无法读取此文件中的数据。我有以下错误

severe (64): input conversion error, unit 18

Image              PC                Routine            Line        Source             
a.out              00000000004734AA  Unknown               Unknown  Unknown
这是我的代码:

        program dataread
        implicit none
        character*15 ::head_1,head_2,head_3,head_4,head_5,head_6
        character*15:: B,C, head_7,head_8,head_9,head_10
        real,dimension(1:71385,1:10)::A
        integer::i,j

        open(unit=18, file='Tws15thHourlyData.csv' , status='old',
     &  access ='sequential',form='formatted')!,recl=71781*10)

        read(18,*) head_1,head_2,head_3,head_4,head_5,head_6,
     &          head_7,head_8, head_9,head_10


       do i=2,71385
       read(18,300)(A(i,j),j=1,10)
300    format(I5,A17,2F9.6,A8,5F4.1)
       end do

        print*, head_1,head_2,head_3,head_4,head_5,head_6,
     &          head_7,head_8,   head_9,head_10
       do i=2,71385
       read(18,300)(A(i,j),j=1,10)
300    format(I5,A17,2F9.6,A8,5F4.1)
       end do

        print*, head_1,head_2,head_3,head_4,head_5,head_6,
     &          head_7,head_8,   head_9,head_10


        do i=2,71385
              print*, (A(i,j),j=1,10)
        end do
        close(18)
        open(unit=28,file='14data.txt')
        write(28, 100),((A(i,j),j=1,10),i=2,71385)
100     format(10(71385(I4,A15,2F9.6,A8,5F4.1,2x),/))
        end program
这是我试图读取的数据

TWSCODE,DISTRICT,LATITUDE_DD,LONGITUDE_DD,RECORDED_DATE,HOUR,TEMPERATURE,HUMIDITY,WIND_SPEED,WIND_DIRECTION

109,KALABURAGI,17.463587,77.42,14-08-17,0,26.2,79.4,0,168
109,KALABURAGI,17.463587,77.42,14-08-17,0,26.2,80,0,25

109,KALABURAGI,17.463587,77.42,14-08-17,0,26.1,80.4,0,25
109,KALABURAGI,17.463587,77.42,14-08-17,0,25.9,81,0,25

109,KALABURAGI,17.463587,77.42,14-08-17,1,25.8,81.7,0,25
109,KALABURAGI,17.463587,77.42,14-08-17,1,25.9,82,0,287
109,KALABURAGI,17.463587,77.42,14-08-17,1,25.9,82.5,0,299
109,KALABURAGI,17.463587,77.42,14-08-17,1,25.8,82.8,0,286
109,KALABURAGI,17.463587,77.42,14-08-17,2,25.6,83.5,0,254
109,KALABURAGI,17.463587,77.42,14-08-17,2,25.6,83.9,0,292
109,KALABURAGI,17.463587,77.42,14-08-17,2,25.6,84,0,299
109,KALABURAGI,17.463587,77.42,14-08-17,2,25.6,84.2,0,309
109,KALABURAGI,17.463587,77.42,14-08-17,3,25.5,84.4,0,327
109,KALABURAGI,17.463587,77.42,14-08-17,3,25.4,84.8,0,315
109,KALABURAGI,17.463587,77.42,14-08-17,3,25.3,84.8,0,305
109,KALABURAGI,17.463587,77.42,14-08-17,3,25.2,84.8,0,306
109,KALABURAGI,17.463587,77.42,14-08-17,4,25.2,84.9,0,305
109,KALABURAGI,17.463587,77.42,14-08-17,4,25.2,85.1,0,306
109,KALABURAGI,17.463587,77.42,14-08-17,4,25.1,85.3,0,305
109,KALABURAGI,17.463587,77.42,14-08-17,4,25.1,85.4,0,305
109,KALABURAGI,17.463587,77.42,14-08-17,5,25.1,85.7,0,308
这是一种方法:

 integer,parameter :: n=71385
 character*15 :: strings(10,n)
 real :: a(7,n)
 integer :: tw(n)


另请注意,我对数组进行了转置,以便将赋值分配到连续的内存位置。

我不喜欢@agentp的答案,完全不同意这样的评论,即应该将该行作为字符串来阅读,并将其解析得一团糟

所以我写了这个

正如我在上面的一条评论中指出的,OP代码中的一个错误(可能是唯一的一个)是使用了这个语句和格式

       read(18,300)(A(i,j),j=1,10)
300    format(I5,A17,2F9.6,A8,5F4.1)
用于尝试将数字和字符串混合读入
reals
数组。那永远不会有好结果。退后一步,好好考虑一下。输入文件包含一些结构良好的数据,为什么不定义一个良好的存储结构呢?首先是类型定义,类似于:

  TYPE :: met_record
     INTEGER :: TWSCODE
     CHARACTER(len=32) :: DISTRICT
     REAL :: LATITUDE_DD
     REAL :: LONGITUDE_DD
     CHARACTER(len=8) :: RECORDED_DATE
     INTEGER :: HOUR
     REAL :: TEMPERATURE
     REAL :: HUMIDITY
     REAL :: WIND_SPEED
     REAL :: WIND_DIRECTION
  END TYPE met_record
然后是一组

TYPE(met_record), DIMENSION(71385) :: weather_reports
现在读取数据确实很容易

do i = 1, 71385
    read(18,*) weather_reports(i)
end do
看!看不到明确的格式。正确声明变量并让Fortran解析输入行

注:

  • 我写的是相对现代的Fortran,没有固定格式的源文件
  • 我还没有为读取文件头做任何安排,已经有了相应的代码
  • 编写气象记录可以像编写(28,*)天气报告(i)

我看不到任何代码。不管怎样,当您尝试代码时遇到了什么样的问题?请显示代码并描述错误。读和写。那么当你使用你的代码时会发生什么呢?你的帖子里没有问题。你想知道什么?您对显示的代码有任何问题吗?我们无法读懂你的心思。你必须问一个问题。你使用哪种编译器?如何编译代码?请使用编译器提供的所有调试功能。(
gfortran-g-fbacktrace-Wall-fcheck=all
ifort-g-traceback-warn-check
)。要进行格式化读取,您需要“读取”逗号,声明一个长度为1的字符串,并在读取行中重复包含该字符串,并在格式中添加适当的
a
。交替地将整行列为字符串读取,并从字符串中读取所需的内容。
do i = 1, 71385
    read(18,*) weather_reports(i)
end do