Module table

Reading CSV Files.

This reads tab- or comma-delimited data, optionally treating the first row as a set of headers (TableCsv implies both commas and header row). The rows are then available as an array of string arrays.

If TableColumns is also specified, it will additionally create columns, which will be converted into float arrays if they appear to be numbers.

Given a simple CSV file like this:

Name,Age
Bonzo,12
Alice,16
Frodo,46
Bilbo,144

then the most straightforward way to read it would be:

Table *t = table_new_from_file("test.csv", TableCsv | TableAll | TableColumns);
if (t->error) { // note how you handle errors: file not found, conversion failed
    fprintf(stderr,"%s\n",t->error);
    return 1;
}
// printing out first row together with column names
char **R = t->rows[0];
for (char **P = t->col_names; *P; ++P,++R)
    printf("'%s' (%s),",*P,*R);
printf("\n");

// getting the second column with default conversion (float)
float *ages = (float*)t->cols[1];

With table_convert_cols you can customize column conversion, and even provide your own conversion functions. These look like this:

const char *int_convert(const char *str, void *res) {
    \*((int*)res) = strtol(str,&endptr,10);
    return *endptr ? endptr : NULL;
}

That is, they set the value and return an error if conversion is impossible.

See test-table.c for an example with custom conversions, and test-sqlite3-table.c for a case where the table is built up using table_add_row (which by design matches the required signature for sqlite3_exec.)

Functions

table_new (opts) create a new empty table.
table_convert_cols (T, ...) custom conversion for table columns.
table_generate_columns (T) Explicitly create columns.
table_read_all (T) Read all of a table into rows.
table_add_row (d, ncols, row, columns) explicitly add new rows to a table.
table_finish_rows (T) explicitly finish off a table created with table_add_row.
table_new_from_stream (in, opts) Create a table from an opened file stream.
table_new_from_file (fname, opts) Create a table from a file path.


Functions

table_new (opts)
create a new empty table. opts are a set of flags: TableTab, TableComma, TableColumnNames, TableCsv (implying last two), TableColumns (create columns as well).

Parameters:

  • opts int

Returns:

    Table *
table_convert_cols (T, ...)
custom conversion for table columns. Normally, table attempts to convert numerical columns to arrays of float. With this you can force the conversion to int arrays or leave them as strings, etc

Each entry is a zero-based column index, and a type, one of TableString, TableFloat, TableInt and TableCustom. If it’s a custom conversion, then follow TableCustom with a TableConvFun. The argument list ends with -1, which is an invalid column index.

Parameters:

  • T Table *
  • ...
table_generate_columns (T)
Explicitly create columns. Only does this if the flags have TableColumns set. This is implicitly called by table_read_all and table_finish_rows.

Parameters:

  • T Table *

Returns:

    bool
table_read_all (T)
Read all of a table into rows. If flag has TableColumns set, create columns as well.

Parameters:

  • T Table *

Returns:

    bool
table_add_row (d, ncols, row, columns)
explicitly add new rows to a table.

Parameters:

  • d void *
  • ncols int
  • row char * *
  • columns char * *

Returns:

    int
table_finish_rows (T)
explicitly finish off a table created with table_add_row.

Parameters:

  • T Table *

Returns:

    bool
table_new_from_stream (in, opts)
Create a table from an opened file stream. opts have same meaning as for table_new. If unsuccesful, the table’s error field will be non-NULL.

Parameters:

  • in FILE *
  • opts int

Returns:

    Table *
table_new_from_file (fname, opts)
Create a table from a file path. opts have same meaning as for table_new. If unsuccesful, the table’s error field will be non-NULL.

Parameters:

  • fname const char *
  • opts int

Returns:

    Table *
generated by LDoc 1.4.3 Last updated 2015-04-27 12:35:55