“列表定向的io语法错误”从Fortran的第一行开始读取CSV

问题描述

我需要从CSV文件中读取矩阵数据。该数据全为数字,但可能没有固定格式。这是一个名为Data.csv

文件的示例
1,2.1,3,4
2,4.2,5
3,4,5,6.33
4,6,7
5,7,8
6,8,9
7,9,10
8,10,11

我尝试了两件事。首先编写一个从CSV文件读取未格式化数据的子例程。

program main

implicit none
integer,parameter :: dp = selected_real_kind(15,307)
integer,parameter :: N = 8
integer,parameter :: M = 4    
integer           :: i
real(dp)          :: yr(N,M)   

! Reading file using subroutine
call txtr_data_mat('Data.csv',yr)

contains    

subroutine txtr_data_mat(filename,rdata)
    character (len=*),intent(in) :: filename
    real(dp),intent(inout)       :: rdata(:,:)
    integer                      :: n1,n2,i1,i2
    character (60)               :: fnametxt
    fnametxt = trim(filename)
    n1 = size(rdata,1)
    n2 = size(rdata,2)
    open (12,file = fnametxt)
    read (12,*) ((rdata(i1,i2),i2=1,n2),i1=1,n1)
    close(12)
end subroutine txtr_data_mat
    
end program main

这给我一个错误forrtl: severe (59): list-directed I/O Syntax error,unit 12,file C:\source\Data.csv。我还尝试了一些更简单的方法。我没有使用上面的子例程,而是尝试了:

open (17,file='Data.csv')
do i = 1,N
    read (17,*) yr(i,:)
end do
close(17)

这也会产生相同的错误forrtl: severe (59): list-directed I/O Syntax error,unit 17,file C:\source\Data.csv。奇怪的是,当我读到“空白”行时,通过在read (17,'()')命令和循环开头之间添加open,似乎可以工作一段时间,但是,顺便说一句,它跳过了第一个行,因此它到达文件末尾而没有完成(错误forrtl: severe (24): end-of-file during read,file C:\source\Data.csv)。

有关如何解决此问题的任何想法?我一开始尝试使用子例程作为子例程,因为我需要对具有不同形状的不同矩阵重复执行相同的过程多次。

解决方法

如果文件是UTF-8编码的,则应使用ENCODING说明符在OPEN语句中通知编译器。

在给定的UTF-8编码方案的Unicode规范下,当被告知编码并且仍然无法处理BOM标记时,可以肯定地说,当前的Intel Fortran版本中存在一个编译器运行时错误。