Supported file formats
Diafunc reads more than 45 file formats out of the box: tabular, machine-learning, columnar, semi-structured, databases and archives, scientific and engineering, statistical software, official statistics, maps and locations, and Python objects. Every format is sniffed from magic bytes plus the filename and MIME type, so 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 reads anything that looks like delimited text, auto-detecting delimiter (
,, ;, \t), quote character, encoding, and header row. A binary file is never read as CSV: an unrecognised one is rejected with a message that says what it is. When the detection gets a file wrong, the Looks wrong? panel under the preview lets you set the header row, delimiter, quote character, missing-value token and, for aligned text, the column widths. | Format | Extensions | Multi-table | Notes |
|---|---|---|---|
| CSV / TSV | .csv .tsv .psv .txt | Auto-detects delimiter, quote character, encoding, and header row. Text without a table layout gets a warning in the preview instead of a one-column import. | |
| Fixed-width text | .fwf .prn, aligned .txt / .dat | Columns split at the aligned gaps (as numpy.savetxt, pandas.to_string and many government exports write them) or at runs of spaces. Set the widths by hand when the split is wrong. | |
| Excel | .xlsx .xlsm .xltx .xltm .xlsb .xls | Every non-empty sheet can be picked. Numbers stay numbers, dates import as ISO 8601, formulas as their computed value, error cells (#DIV/0!) as empty. The header row is detected. Excel 95 and older, and password-protected workbooks, are rejected. | |
| OpenDocument spreadsheet | .ods .ots .fods | LibreOffice, OpenOffice and Google Sheets exports, sheet by sheet; percentages import as their value (25 % becomes 0.25). |
Machine-learning datasets
The formats benchmark repositories publish in. An OpenML dataset can be uploaded exactly as downloaded, as ARFF or as Parquet.
| Format | Extensions | Multi-table | Notes |
|---|---|---|---|
| ARFF | .arff | OpenML and Weka files, dense and sparse. Nominal attributes arrive as text, dates as ISO dates, ? as missing, instance weights as a weight column. Relational (multi-instance) attributes are rejected. | |
| LIBSVM / SVMlight | .libsvm .svm .svmlight, and extensionless files | label index:value … rows become one column per feature (f1 … fN), with 0 where a row omits a feature. At most 16,384 features. | |
UCI .data + .names | .zip | A headerless .data file takes its column names from the .names file next to it in the zip, when their counts agree. |
Columnar / structured
Self-describing columnar formats from the Apache analytics ecosystem. Schema is read directly from the file, with no header-row assumptions.
| Format | Extensions | Multi-table | Notes |
|---|---|---|---|
| Apache Parquet | .parquet | A partitioned directory of part-files is uploaded as a zip, or as several files chosen together in the Analyze wizard, and stacked into one table. | |
| Apache Arrow IPC / Feather | .arrow .feather | Both file and stream IPC paths (Feather version 2). | |
| Apache ORC | .orc | Schema → columns; vectorized row-batch reader. | |
| Avro container | .avro | Read in memory, without a Hadoop installation. |
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, array-of-arrays, and pandas to_json output in every orient. An object that wraps arrays of records ({"data": [...]}, typical of APIs) imports its largest array; the others are named in the warning. | |
| 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. |
Databases and archives
Files 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 through DuckDB's JDBC interface. | |
| Microsoft Access | .mdb .accdb | User tables only. Binary, OLE-object and attachment columns are left out; an encrypted database must be decrypted in Access first. | |
| SQL dump | .sql | mysqldump, pg_dump (plain format) and SQLite .dump. Only table definitions and rows are read, and the dump is never executed; views, functions and settings are skipped and counted. For a pg_dump custom-format archive, dump again with --format=plain. | |
| Zip / Tar archive | .zip .tar .tar.gz .tgz | Each entry routed through the matching importer; one level of nesting only. Entries that are not tables, such as a README, are listed as skipped. |
Scientific and engineering
Self-describing scientific-data and measurement formats. Arrays with more than two dimensions import as a long table: one index column per dimension (named after the dimension where the file names it, such as
time, lat, lon) plus a value column, up to 50 million values. | Format | Extensions | Multi-table | Notes |
|---|---|---|---|
| HDF5 | .h5 .hdf5 .he5 .h5ad .jld2 .loom | Every dataset is a table; datasets of equal length in one group are also offered together. AnnData (.h5ad), pandas to_hdf stores, Julia .jld2 and .loom files are read with their column names and index. | |
| NetCDF | .nc .nc4 .cdf | Classic CDF-1 / CDF-2 / CDF-5 and NetCDF-4. Variables along a shared dimension are offered together; packed values and fill values are converted, and variables with 3 or more dimensions become long tables on their coordinates. | |
| NumPy | .npy .npz | Every dtype, both byte orders, C and Fortran order; the fields of a structured array become columns. A .npz lists its arrays. | |
| MATLAB | .mat | Versions 4, 5/7 and 7.3. Each variable is a table, and equal-length vectors are also offered together as one. MATLAB table and timetable variables cannot be read: export them with writetable first. | |
| LAS well log | .las | CWLS LAS 1.2, 2.0 and 3.0. Curves become columns indexed by depth; the file's NULL value (often -999.25) becomes missing. Each LAS 3.0 data section is a table. Binary LiDAR .las files are rejected. | |
| NI TDMS | .tdms | LabVIEW, DAQmx and FlexLogger files. Each group is a table, channels are columns, with a time column when the channels share their waveform timing; DAQmx raw data is scaled to engineering units. | |
| ASAM MDF | .mf4 .mdf .mf3 | MDF 3 and 4 from CANape, INCA and CAN loggers. Each channel group is a table with its time channel first, conversions applied. Raw bus frames are not decoded; unfinalised files must be finalised first. | |
| FITS table | .fits .fit .fts | Each binary or ASCII table in the file can be chosen; images are skipped and named. Scaled columns and null markers are applied, and a short vector per row is spread over numbered columns. A tile-compressed file (.fits.fz) has to be decompressed with funpack first. | |
| NASA CDF | .cdf | Variables that share a time base form one table, with the time written as a UTC timestamp and fill values as missing. Constants that do not change from record to record are not part of a table. A NetCDF file named .cdf is still read as NetCDF. | |
| CERN ROOT | .root | Each TTree or TNtuple is a table, named by its path inside the file. Branches with one number, boolean or text per entry become columns, a fixed-size array one column per element. Variable-length and object branches are named and left out; RNTuple files are not read. |
Statistical software
Formats from SAS, SPSS, Stata, R and gretl. Each is parsed by a pure-Java reader, so no external runtime is required. Dates stored as numbers are turned back into dates, and the packages' missing-value codes import as empty cells.
| Format | Extensions | Multi-table | Notes |
|---|---|---|---|
| SAS | .sas7bdat | parso reader. | |
| SAS Transport | .xpt | Versions 5 and 8/9, as published by the CDC and FDA. A library with several data sets offers each as a table; special missing values (.A to .Z) import as empty. | |
| SPSS | .sav .zsav | Uncompressed, compressed and .zsav. Long variable names, very long strings, the declared encoding and user-missing values are honoured. | |
| SPSS portable | .por | User-missing values import as empty. | |
| Stata | .dta | Stata 4 and later (releases 104 to 119), including strL long strings; %td / %tc columns arrive as dates. Value labels are not applied: labelled variables import as their codes. | |
| R serialized data | .rds | One data frame or 2-D matrix; XDR, ASCII and binary serialization, in a gzip / bzip2 / xz envelope. | |
| R workspace | .rda .RData | Every data frame and matrix in the workspace is a table; models, vectors and functions are listed and skipped. | |
| gretl | .gdt .gdtb | XML (plain or gzipped) and binary data files. A time series gets a leading obs column with its dates; panel data is stacked. |
Official statistics
The cubes statistics offices and central banks publish. A cube has one value per combination of its dimensions, so the upload offers a choice of tables: by default the indicators become columns and every other dimension a key column, and you can pivot by another dimension or pick the long form with one row per value. Cells published as missing, or with a symbol in place of a number, import as missing.
| Format | Extensions | Multi-table | Notes |
|---|---|---|---|
| SDMX | .sdmx .xml .json .csv | SDMX-ML (generic and structure-specific), SDMX-JSON and SDMX-CSV data messages. SDMX-ML and unlabelled SDMX-CSV carry codes, not names, so members import as their codes; SDMX-JSON carries both. | |
| JSON-stat | .json | JSON-stat 2.0 datasets, collections with embedded datasets, and 1.x bundles. Status flags are counted in a note and kept as a column in the long form. | |
| PC-Axis | .px | Tables from PxWeb databases, in the file's default language. Symbols in place of numbers (dots, a dash) import as missing. |
Maps and locations
Map data imports as a table: one row per feature, with the feature's attributes as columns plus two numeric columns for where it is (
lon and lat, or x and y when the file uses a projected coordinate system). A point keeps its own position; a line or an area gets its centroid. The outline itself is not imported, so an analysis can use where something is, not its shape. | Format | Extensions | Multi-table | Notes |
|---|---|---|---|
| GeoJSON | .geojson .geojsonl .json | Feature collections, single features and feature sequences. Properties flatten into columns; a point with a third coordinate (height or depth) keeps it as column z. | |
| Shapefile | .zip | Zip the .shp, .shx and .dbf together, with the .prj and .cpg when present. A zip with several layers lets you pick one; a .shp alone cannot be read. | |
| GeoPackage | .gpkg | Each feature layer is a table, next to any plain tables in the file; the tables the format keeps for itself are left out. A third coordinate is kept for points as column z, and a layer that mixes points, lines and areas gets a geometry_type column. Features with curved geometries import without a position. | |
| GeoParquet | .parquet | A Parquet file with geometry is recognised by itself. The position comes from its primary geometry column; further geometry columns and a bounding-box column are left out. | |
| dBase | .dbf | dBase III / IV / V and FoxPro tables, without the records flagged as deleted. Zip the table with its .dbt or .fpt file to keep memo text. dBase 7 tables are not supported. |
Python objects
Files written by Python's own serialization. A pickle is a program that Python runs when it loads it, so Diafunc never runs one: it reads the data in it without executing anything.
| Format | Extensions | Multi-table | Notes |
|---|---|---|---|
| pickle | .pkl .pickle | pandas DataFrames and Series (pandas 1.x to 3.x), NumPy arrays, and plain lists and dictionaries of records. A pickle that holds any other kind of object is rejected: save the DataFrame with df.to_parquet() instead. | |
| Feather version 1 | .feather | The layout older feather and pandas versions wrote. Newer Feather files are read as Arrow. |
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 cap on the size of a table. 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.
A single upload can be at most 100 MB, wherever the file is uploaded: on the Analyze page, attached in the Assistant chat, in the Lab or through the CLI. A larger file is refused with a message that it is too large. Compressing the file often brings it under the limit, since gzip, bzip2, xz, zstd and zip are read directly. Otherwise 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.
A single upload can be at most 100 MB, wherever the file is uploaded: on the Analyze page, attached in the Assistant chat, in the Lab or through the CLI. A larger file is refused with a message that it is too large. Compressing the file often brings it under the limit, since gzip, bzip2, xz, zstd and zip are read directly. Otherwise 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, the same preview / commit pipeline as the built-ins. User-defined importers are registered in code.
Not supported
Two reasons keep a format out: nothing public describes its layout, or its natural shape is not a table of observations, so an analysis has nothing to work with until the features are extracted in the tool that made it (whose CSV or Parquet export Diafunc reads). A recognisable file of this kind is rejected with a message that names it and says what to upload instead.
- No public layout: MATLAB
table/timetableobjects, pickles of arbitrary Python objects, EViews.wf1, JMP.jmp, Minitab worksheets, Apple Numbers, SAS catalogs (.sas7bcat). - Read only after a conversion: ROOT files that store their data as RNTuple (write a
TTree, or export CSV or Parquet) and tile-compressed FITS tables (.fits.fz, decompress withfunpack). - Tensor and machine-learning stores: Zarr, TFRecord, Lance.
- Event and document data: web server and system logs, XBRL filings, MongoDB dumps, EDI and SWIFT messages.
- Sequences and genomic records: VCF, BED / GFF, mass-spectrometry spectra, molecule files, single-cell count matrices.
- Raw waveforms: EDF / BDF, WFDB, WAV, COMTRADE, JCAMP-DX spectra.
- Point clouds, images and tracks: LiDAR, SEG-Y, GeoTIFF, DICOM, GPX / KML, NMEA.
- GRIB: convert to NetCDF (for example with
cdo), which is read. - Lakehouse tables: Delta Lake and Apache Iceberg; upload a single Parquet file instead.
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.