Skip to content

Save and Fetch (CSV)

A Table can be written to and read back from CSV. Writing is schema-free; reading requires you to declare the type of each column up front.

Writing — write_csv

write_csv(path) serializes the table to a CSV file at path.

use rayforce::{Runtime, Table, Value};

Runtime::scope(|_rt| {
    let t = Table::new(
        &["sym", "price", "size"],
        &[
            Value::sym_vec(&["AAPL", "MSFT", "GOOG"]),
            Value::vec(&[101.5f64, 202.0, 303.25]),
            Value::vec(&[10i64, 20, 30]),
        ],
    )?;

    t.write_csv("/tmp/trades.csv")?;
    Ok(())
})?;
# Ok::<(), rayforce::RayError>(())

Reading — Table::read_csv

Table::read_csv(&[type_tokens], path) reads a CSV, parsing each column according to the type token at the same position. There must be one token per column.

# use rayforce::{Runtime, Table, Value};
Runtime::scope(|_rt| {
    # let t = Table::new(&["sym","price","size"], &[Value::sym_vec(&["AAPL","MSFT","GOOG"]), Value::vec(&[101.5f64,202.0,303.25]), Value::vec(&[10i64,20,30])])?;
    # t.write_csv("/tmp/trades.csv")?;
    let loaded = Table::read_csv(&["SYMBOL", "F64", "I64"], "/tmp/trades.csv")?;

    assert_eq!(loaded.shape(), (3, 3));
    assert_eq!(loaded.column("price")?.as_slice::<f64>()?, &[101.5, 202.0, 303.25]);
    Ok(())
})?;
# Ok::<(), rayforce::RayError>(())

Type tokens

Tokens are conventionally written in UPPERCASE, but matching is case-insensitive ("i64" works as well as "I64").

Token Column type
B8 boolean
U8 byte
I16 16-bit integer
I32 32-bit integer
I64 64-bit integer
F32 32-bit float
F64 64-bit float
DATE date
TIME time
TIMESTAMP timestamp
SYMBOL symbol
STR string
GUID GUID

Aliases

Alias Resolves to
SYM SYMBOL
STRING STR
BOOL, BOOLEAN B8
# use rayforce::{Runtime, Table};
Runtime::scope(|_rt| {
    // these schemas are equivalent
    # let _ = || -> rayforce::Result<()> {
    let a = Table::read_csv(&["SYM", "F64", "I64"], "/tmp/trades.csv")?;
    let b = Table::read_csv(&["symbol", "f64", "i64"], "/tmp/trades.csv")?;
    # let _ = (a, b); Ok(()) };
    Ok(())
})?;
# Ok::<(), rayforce::RayError>(())

Reading order

read_csv matches tokens to columns by position, so the token order must follow the CSV's column order. See Data Types for what each token represents.

For columnar on-disk storage, see Splayed and Parted.