Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Section: Read CSV Files

In this section, we will read CSV files in Fortran using the CSV_Fortran Module. The CSV_Fortran Module is a Fortran module that provides a simple interface for reading and writing CSV files. The module is available at https://github.com/jacobwilliams/csv-fortran. Documentation for the module is available at https://jacobwilliams.github.io/csv-fortran/.

Example Programs

In the documentation for the CSV_Fortran Module, there are several example programs that demonstrate how to read and write CSV files. We will use the example programs to demonstrate how to read CSV files in Fortran.

Reading a CSV File

The following example program reads a CSV file named test.csv:

section_csv_fortran_read_csv.f90
program csv_read_test

  use csv_module
  use iso_fortran_env, only: wp => real64
  
  implicit none
  
  type(csv_file) :: f
  logical :: status_ok
  integer,dimension(:),allocatable :: itypes

  character(len=5),dimension(:),allocatable :: header
  real(wp),dimension(:),allocatable :: x,y,z
  logical,dimension(:),allocatable :: t

  character(len=30), dimension(:,:), allocatable :: table_data_strings
  real(wp), dimension(:,:), allocatable :: table_data_floats

  character(len=30) :: trimmed_string
    
  integer :: i, j, n_rows, n_cols
  integer, dimension(1) :: dim_header
  integer, dimension(2) :: dims_table
  
  ! read the file
  call f%read('test.csv',header_row=1,status_ok=status_ok)
  
  ! get the header and type info
  call f%get_header(header,status_ok)
  call f%variable_types(itypes,status_ok)
  
  ! get some data
  call f%get(1, x, status_ok)
  call f%get(2, y, status_ok)
  call f%get(3, z, status_ok)
  call f%get(4, t, status_ok)
  call f%get(table_data_strings, status_ok)

  ! print the size, shape and contents of the header
  print *, "Print out the size, shape and contents of the header"
  write (*, '(a, i3)') 'size = ', size(header)
  dim_header = shape(header)
  write (*, '(a, i3)') 'shape = ', dim_header(1)
  write (*, *) 'header = ', header

  print *

  ! print the types
  print *, "Print out the types"
  write (*, *) 'types = ', itypes

  print *
  
  ! print the data
  print *, "Print out the data that was read one at a time"
  print *, 'x = ',x
  print *, 'y = ',y
  print *, 'z = ',z
  print *, 't = ',t

  print *

  ! print the size, shape and contents of the table data
  print *, "Print out the size, dimensions and contents of the table data read all at once"
  write (*, '(a, i3)') 'table size = ', size(table_data_strings)

  dims_table = shape(table_data_strings)
  n_rows = dims_table(1)
  n_cols = dims_table(2)

  write (*, '(a, i3)') '# of rows = ', n_rows
  write (*, '(a, i3)') '# of columns = ', n_cols
  print *
  print *, "Printing out the table data directly from the variable..."
  write (*, *) 'table_data = ', table_data_strings

  ! use loop to print the table data
  print *, "Using loop to print the table data..."
  do i = 1, size(table_data_strings,1)
    write (*, *) table_data_strings(i,:)
  end do

  print *

  ! convert the table data to floats
  print *, "Converting the table data from strings to floats..."

  allocate(table_data_floats(n_rows,n_cols))
  do i = 1, n_rows
    do j = 1, (n_cols - 1) ! last column is a string i.e. T or F
      trimmed_string = adjustl(trim(table_data_strings(i,j)))
      read(trimmed_string, *) table_data_floats(i,j)
      !read(trimmed_string, '(f30.20)') table_data_floats(i,j)
      !print *, 'trimmed_string = ', trimmed_string
    end do
  end do

  print *

  ! print the table data as floats using a loop
  print *, "Printing out the table data as floats using a loop"
  do i = 1, n_rows
      write (*, *) table_data_floats(i,1:3)
  end do

  deallocate(table_data_floats)
  deallocate(table_data_strings)
  deallocate(header)
  deallocate(itypes)
  deallocate(x)
  deallocate(y)
  deallocate(z)
  deallocate(t)

  ! destroy the file
  call f%destroy()
  
  end program csv_read_test
  

The program reads a CSV file named test.csv with the following contents:

x,y,z,t
1.000,2.000,3.000,T
4.000,5.000,6.000,F

Building the Example Program using FPM (Fortran Package Manager)

TOML File

The above program was compiled using the Fortran Package Manager (FPM). The following is the fpm.toml file used to build the program:

fpm.toml
name = "Section_CSV_Fortran_Read_CSV"

[build]
auto-executables = true
auto-tests = true
auto-examples = true

[install]
library = false

[dependencies]
csv-fortran = { git="https://github.com/jacobwilliams/csv-fortran.git" }

[[executable]]
name="Section_CSV_Fortran_Read_CSV"
source-dir="app"
main="section_csv_fortran_read_csv.f90"



Build the Program

import os
root_dir = ""
root_dir = os.getcwd()
code_dir = root_dir + "/" + "Fortran_Code/Section_CSV_Fortran_Read_CSV"
os.chdir(code_dir)
build_status = os.system("fpm build 2>/dev/null")

Display the CSV File

!cat test.csv
"x","y","z","t"
1.000,2.000,3.000,T
4.000,5.000,6.000,F

Run the Program

The program is then run:

exec_status = \
    os.system("fpm run 2>/dev/null")
 Print out the size, shape and contents of the header
size =   4
shape =   4
 header = x    y    z    t    

 Print out the types
 types =            2           2           2           4

 Print out the data that was read one at a time
 x =    1.0000000000000000        4.0000000000000000     
 y =    2.0000000000000000        5.0000000000000000     
 z =    3.0000000000000000        6.0000000000000000     
 t =  T F

 Print out the size, dimensions and contents of the table data read all at once
table size =   8
# of rows =   2
# of columns =   4

 Printing out the table data directly from the variable...
 table_data = 1.000                         4.000                         2.000                         5.000                         3.000                         6.000                         T                             F                             
 Using loop to print the table data...
 1.000                         2.000                         3.000                         T                             
 4.000                         5.000                         6.000                         F                             

 Converting the table data from strings to floats...

 Printing out the table data as floats using a loop
   1.0000000000000000        2.0000000000000000        3.0000000000000000     
   4.0000000000000000        5.0000000000000000        6.0000000000000000