Supported file formats
Diafunc accepts more than 20 file formats out of the box, organized in six categories: tabular, columnar, semi-structured, archive / multi-table, scientific, and statistical-software. Every format is sniffed from magic bytes plus the filename and MIME type — usually you can drag the file straight into the upload area without configuring anything.
For dialect quirks (encodings, decimal separators, missing-value conventions, flattening nested JSON / YAML / XML) see preparing your data. The live catalogue is also served at
For dialect quirks (encodings, decimal separators, missing-value conventions, flattening nested JSON / YAML / XML) see preparing your data. The live catalogue is also served at
GET /api/v1/storage/table-imports/supported-formats — the same source of truth the Lab file picker uses for its accept= attribute. Tabular
Plain row × column tables. The CSV importer is the catch-all — it accepts anything that looks like delimited text, auto-detecting delimiter (
,, ;, \t), quote character, encoding, and header row. | Format | Extensions | Multi-table | Notes |
|---|---|---|---|
| CSV / TSV | .csv .tsv .psv .txt | Auto-detects delimiter, quote character, encoding, and header row. | |
| Excel | .xlsx .xls | ● | Multi-sheet picker on preview; macros and embedded objects are ignored. |
Columnar / structured
Self-describing columnar formats from the Apache analytics ecosystem. Schema is read directly from the file — no header-row assumptions.
| Format | Extensions | Multi-table | Notes |
|---|---|---|---|
| Apache Parquet | .parquet | parquet-avro reader. Partitioned directories of part-files are not supported — upload a single file. | |
| Apache Arrow IPC / Feather | .arrow .feather | Both file and stream IPC paths. | |
| Apache ORC | .orc | Schema → columns; vectorized row-batch reader. | |
| Avro container | .avro | DataFileReader over in-memory bytes (no Hadoop). |
Semi-structured
Tree-shaped formats that the importer flattens to row × column. Nested objects expand into dotted column names (
user.address.city); arrays of objects become rows. For shapes the heuristic doesn't catch, register a user-defined importer or pre-flatten in your source tool. | Format | Extensions | Multi-table | Notes |
|---|---|---|---|
| JSON / JSONL / NDJSON | .json .jsonl .ndjson | Array-of-objects, NDJSON, or single object shapes; nested objects auto-flatten with dotted column names. Single objects wrapping one array surface a warning — pre-flatten if the heuristic guesses wrong. | |
| YAML | .yaml .yml | Sequence-of-mappings, multi-document, or single-mapping shapes. | |
| XML | .xml | Row pattern auto-detected as the highest-cardinality child of root. Register a user-defined importer for custom XPath shapes. | |
| HTML tables | .html .htm .xhtml | ● | Every <table> element is a separate inner table; rowspan / colspan are not expanded. |
| PDF tables | ● | Best-effort table extraction via Tabula (lattice + stream). Every preview carries a verification warning — eyeball the result before committing. |
Archive / multi-table
File formats that hold more than one logical table. After upload, the preview shows an inner-table picker — select which table you want to import. To import additional tables from the same file, re-upload and pick a different selection.
| Format | Extensions | Multi-table | Notes |
|---|---|---|---|
| SQLite | .sqlite .sqlite3 .db | ● | Inner-table picker over sqlite_master. |
| DuckDB | .duckdb .ddb | ● | Inner-table picker over the base tables / views; opened directly via the DuckDB JDBC driver. |
| Zip / Tar archive | .zip .tar .tar.gz .tgz | ● | Each entry routed through the matching importer; one level of nesting only. |
Scientific
Self-describing scientific-data formats. Group-tree / variable enumeration surfaces every 2-D dataset as an inner table. Rank > 2 datasets are rejected with a clear error rather than silently flattening — if you need them, project to ≤ 2 dimensions in your source tool first.
| Format | Extensions | Multi-table | Notes |
|---|---|---|---|
| HDF5 | .h5 .hdf5 .he5 | ● | Group-tree walk surfaces every dataset; rank > 2 datasets rejected. |
| NetCDF | .nc .nc4 .cdf | ● | Classic CDF-1 / CDF-2 (hand-rolled reader) + HDF5-backed NetCDF-4 (delegated to HDF5). Variables with rank > 2 rejected. |
Statistical software
Formats from SAS, SPSS, Stata, and R. Each is parsed by a pure-Java reader — no external runtime is required. Where a format has multiple variants, the supported subset and the rejection contract for the rest are documented per row.
| Format | Extensions | Multi-table | Notes |
|---|---|---|---|
| SAS | .sas7bdat | parso reader. SAS Transport (.xpt) is not supported. | |
| SPSS | .sav .zsav | $FL2 only — .zsav ($FL3 zlib-framed) is rejected with a clear "re-export as .sav" error. Long string variables (> 8 bytes) expose only the first 8 bytes. | |
| Stata | .dta | Releases 117 / 118 / 119 (Stata 13 / 14+ / 15+). Pre-117 + strL rejected with a clear "re-export as v13+ or CSV" error. | |
| R serialized data | .rds | gzip / bzip2 / xz envelope. Top-level must be a data.frame or a 2-D atomic matrix. ASCII-serialized RDS rejected; .rda / .RData multi-object archives not supported (different format). |
Compression envelopes
Any of the formats above can be wrapped in
gzip (.gz), bzip2 (.bz2), xz, or zstd. The decompression layer unwraps transparently before sniffing the inner format. So data.csv.gz, mydata.json.gz, and archive.tar.gz all work without any configuration. File size and large imports
There is no fixed byte cap on an import. Tables scale with the project's storage quota rather than with memory, so millions of rows and hundreds of columns are supported, and the practical ceiling is the account's storage credit allowance.
Uploading through the web app is reliable up to a few hundred megabytes. For a file larger than that, split it and import the parts one after another with the CLI:
Importing into a table that already holds data appends to it, so a sequence of parts builds one table. Both the table reference and the file are positional arguments. See the CLI commands reference for the full command surface.
Uploading through the web app is reliable up to a few hundred megabytes. For a file larger than that, split it and import the parts one after another with the CLI:
diafunc table import my-table part-01.csvdiafunc table import my-table part-02.csvImporting into a table that already holds data appends to it, so a sequence of parts builds one table. Both the table reference and the file are positional arguments. See the CLI commands reference for the full command surface.
User-defined importers
For proprietary formats Diafunc doesn't handle out of the box, you can register a user-defined importer (UDI): a Diafunc function with the right signature, mapped to a MIME pattern and / or filename glob. Once registered, the file picker and the dispatcher route matching uploads through your function — same preview / commit pipeline as the built-ins. User-defined importers are registered in code.
Related
- Preparing your data — encodings, decimal separators, missing-value conventions, multi-table picking, flattening JSON / YAML / XML, format-specific gotchas.
- Analyses — the automatic analysis workflow that takes the uploaded table as input.
- Tables — the core table entity that holds the imported data.
- CLI commands — importing and exporting tables from the command line, which is the path for files too large to upload in one go.