df_write_csv Subroutine

public subroutine df_write_csv(df, filename)

Export data frame to CSV file

Writes the data frame to a CSV file with optional headers. Handles all data types: real, integer, logical, character, and complex.

@param[in] df The data frame to export @param[in] filename Path to the output CSV file

Note

Character values are quoted in the output

Note

Complex values are written as (real,imag)

Arguments

Type IntentOptional Attributes Name
type(data_frame), intent(in) :: df
character(len=*), intent(in) :: filename

Source Code

    subroutine df_write_csv(df, filename)
        type(data_frame), intent(in) :: df
        character(len=*), intent(in) :: filename

        integer :: unit, i, j, dtype
        integer :: num_cols, num_rows
        type(column) :: data_col
        logical :: has_headers

        open (newunit=unit, file=filename, status='replace', action='write')

        num_cols = df % ncols()
        num_rows = df % nrows()
        has_headers = df % get_with_headers()

        ! Write headers if present
        if (has_headers) then
            do i = 1, num_cols
                if (i > 1) write (unit, '(a)', advance='no') ','
                write (unit, '(a)', advance='no') trim(df % header(i))
            end do
            write (unit, '(a)') ''
        end if

        ! Write data
        do j = 1, num_rows
            do i = 1, num_cols
                if (i > 1) write (unit, '(a)', advance='no') ','

                data_col = df % get_data_col(i)
                dtype = data_col % get_type()

                select case (dtype)
                case (REAL_NUM)
                    write (unit, '(g0)', advance='no') data_col % getr(j)
                case (INTEGER_NUM)
                    write (unit, '(i0)', advance='no') data_col % geti(j)
                case (LOGICAL_NUM)
                    write (unit, '(l1)', advance='no') data_col % getl(j)
                case (CHARACTER_NUM)
                    write (unit, '(a)', advance='no') '"'//trim(data_col % getch(j))//'"'
                case (COMPLEX_NUM)
                    write (unit, '("(",g0,",",g0,")")', advance='no') data_col % getc(j)
                end select
            end do
            write (unit, '(a)') ''
        end do

        close (unit)
    end subroutine df_write_csv