问题描述
我需要从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版本中存在一个编译器运行时错误。