file-io - `list-directed io syntax error` 从 Fortran 的第一行开始读取 CSV
问题描述
我需要从 CSV 文件中读取矩阵数据。这些数据都是数字,但它可能没有固定的格式。这是一个名为的文件的示例Data.csv
1,2.1,3,4
2,3,4.2,5
3,4,5,6.33
4,5,6,7
5,6,7,8
6,7,8,9
7,8,9,10
8,9,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, unit 17, file C:\source\Data.csv
。
关于如何解决这个问题的任何想法?我试图在一开始就使用一个子程序,因为我需要对不同形状的不同矩阵重复同样的过程很多次。
解决方案
如果文件是 UTF-8 编码的,您应该在 OPEN 语句中使用 ENCODING 说明符通知编译器。
鉴于 UTF-8 编码方案的 Unicode 规范,当前 Intel Fortran 版本中可能存在编译器运行时错误,当它被告知编码并且仍然无法处理 BOM 标记时。