首页 > 解决方案 > `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

关于如何解决这个问题的任何想法?我试图在一开始就使用一个子程序,因为我需要对不同形状的不同矩阵重复同样的过程很多次。

标签: file-iofortranintel-fortran

解决方案


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

鉴于 UTF-8 编码方案的 Unicode 规范,当前 Intel Fortran 版本中可能存在编译器运行时错误,当它被告知编码并且仍然无法处理 BOM 标记时。


推荐阅读