There are several possible strategies to read the file in csv format with delimiter ';'
and separate read fields.
Below follows a commented example, which reads each line of the file and stores it in the variable linha_texto
.
The looping that is just after reading the line, traverses each character of the line and looks for a ';'
and, if found, stores the "last" value in an array item dados
.
After this looping, all (78) columns are available in the array and are printed separately in the standard output (console).
PROGRAM vazoes
IMPLICIT NONE
INTEGER :: i
! A variavel status verifica se houve
! algum erro ao abrir o arquivo
INTEGER :: status = 0
! Contador de posições de campos e número de campos
INTEGER :: posicao_campo = 0, campos = 0
! Aloca espaco para leitura de uma linha de texto
CHARACTER*2048 :: linha_texto
! Aloca espaço para um registro do banco de dados (78 campos)
CHARACTER*32, DIMENSION(78) :: dados
! Abre o arquivo
OPEN(UNIT=15, IOSTAT=status, FILE='vazoes.txt', STATUS='OLD')
! Verifica se houve erro ao abrir o arquivo
IF (status .GT. 0) THEN
WRITE(*,*) "Erro ao abrir o arquivo!"
! Finaliza a execução se houve erro
STOP
ENDIF
! Looping de leitura do arquivo
DO
! Lê uma linha completa (um registro)
READ(15, '(A)', IOSTAT=status) linha_texto
! Verifica se chegou no final do arquivo...
IF (status .LT. 0) THEN
! ...e sai do looping se finalizou
EXIT
ENDIF
! Separa os campos utilizando o ';' como delimitador
posicao_campo = 1
campos = 1
DO i=1,LEN(linha_texto)
! se encontrar o ';'...
IF (linha_texto(i:i) == ';') THEN
! ...adiciona o campo no array 'dados'
dados(campos) = linha_texto(posicao_campo:i-1)
campos = campos + 1
! marca a posição do último ';' encontrado
posicao_campo = i+1
ENDIF
ENDDO
! Imprime cada campo em formato texto na saída padrão
WRITE(*,*) 'Inicio'
DO i=1,campos-1
WRITE(*,*) dados(i)
ENDDO
WRITE(*,*) 'Fim.'
END DO
! Fecha o arquivo
CLOSE(UNIT=15, IOSTAT=status)
! Verifica se houve erro ao fechar o arquivo
IF (status .GT. 0) THEN
WRITE(*,*) "Erro ao fechar o arquivo!"
! Finaliza a execução se houve erro
STOP
ENDIF
END PROGRAM vazoes
The organization of the records read in the variable dados
and the conversion of the data to the correct types (date, integer, etc.) needs to be implemented and depends on the processing goal you intend to implement in the program.
If the data file format changes, you need to change the program or implement a dynamic allocation strategy (e.g.: ALLOCATE) of arrays, which adapts to variable formats during runtime ('Runtime').