Help
Supported import formats
How results are checked
Named statistical review pending. Selected automated reference cases are published on the validation page.Crosstabs imports CSV, TSV and TXT, Excel .xlsx, .xlsm, .xls and .xlsb, OpenDocument .ods and .fods, SPSS .sav, .zsav and .por, Stata .dta, SAS .sas7bdat and .xpt, R .rds and .RData, Parquet, Arrow and Feather, SQLite database files, and flat JSON or JSON Lines, up to 50 MB and 1,000,000 respondent rows. From a workbook, the worksheet with the most data is read; from an R workspace or a database, you choose the table. A Qualtrics .qsf can be added alongside a response file to apply question wording.
Open a data file
Files are parsed locally before you enter the workspace.
Supported files and requirements
- CSV .csv .tsv .txt
- Excel .xlsx .xlsm .xls .xlsb
- SPSS .sav .zsav .por
- Stata .dta
- SAS .sas7bdat .xpt
- R .rds .rdata .rda
- Parquet .parquet
- JSON .json .jsonl .ndjson
- OpenDocument .ods .fods
- Arrow/Feather .arrow .feather .ipc
- SQLite .sqlite .sqlite3 .db
Optional: a matching Qualtrics .qsf file adds question wording.
Use one row per respondent's answers.
Or try a realistic sample
Supported formats
| Format | Extensions | How it is read |
|---|---|---|
| Delimited responses | .csv, .tsv, .txt | A header row followed by response rows. UTF-8, UTF-16 and common legacy encodings (GBK/GB18030, Shift-JIS, Windows-1252) are detected. |
| Excel responses | .xlsx, .xlsm | The worksheet with the most data is read, with one header row. Macros are never run. |
| SPSS responses | .sav | Compressed and uncompressed SAV files keep labels, user-missing codes and ranges; date formats become calendar dates. |
| JSON responses | .json, .jsonl, .ndjson | An array of flat response objects, or one object per line. Nested/repeating answers need explicit mapping. |
| Qualtrics questionnaire (companion) | .qsf | Select alongside one response file. Exact export-tag matches add question wording; QSF contains no responses. |
| Crosstabs project | .ctproj | A verified project containing its working dataset. |
| Legacy Excel and OpenDocument spreadsheets | .xls, .xlsb, .ods, .fods | Excel 97–2003 (.xls), Excel binary (.xlsb), LibreOffice/OpenDocument (.ods) and flat OpenDocument XML (.fods) workbooks are read like .xlsx: the worksheet with the most data, with one header row. Saved formula results are used; nothing is recalculated and macros are never run. |
| Other SPSS formats | .zsav, .por | Labels, user-missing codes and missing ranges are preserved; date formats become calendar dates. |
| Stata | .dta | Single datasets; tagged missing values are excluded from analysis. |
| SAS | .sas7bdat, .xpt | Data and embedded variable labels. External catalogs are not applied. |
| R data | .rds, .rdata, .rda | Data frames, tibbles and data.tables saved with saveRDS() or save() (gzip or uncompressed). Factors keep their levels as value labels (ordered factors become ordinal); Date and POSIXct become calendar dates; haven labels, value labels and declared missing codes are kept. From an .RData file with several data frames you choose one. |
| Parquet | .parquet | One table; snappy, gzip, zstd, brotli and LZ4 compression. Dates and timestamps become calendar dates, decimals become numbers and nulls become missing. Nested list, map and struct columns are imported as JSON text. |
| Arrow and Feather | .arrow, .feather, .ipc | Arrow IPC files and streams and Feather version 2, uncompressed or LZ4/zstd compressed. Dictionary (categorical) columns keep their categories as value labels. Feather version 1 files must be saved again as version 2. |
| SQLite database | .sqlite, .sqlite3, .db | The database file is opened read-only in the browser; you choose the table or view to import. Live database connections are not offered. |
Password-protected workbooks and HTML or XML spreadsheet exports named .xls are not read: export the response sheet as .xlsx or UTF-8 CSV. Statistical scripts (.sps, .sas, .do) are never executed, and questionnaires or reports (PDF, DOCX, images) are not respondent-level data. Database files are opened from your device only. To bring in data from a live database or survey platform, use a warehouse connection in the workspace, or the Python package's crosstabs pull and local bridge on your own computer (setup).
- DuckDB database (.duckdb): not read yet. DuckDB files cannot be opened in the browser yet. Export the table from DuckDB as Parquet or CSV (COPY my_table TO 'responses.parquet'), then import that file.
- Survey definitions and interchange (.xml, .sss, .lss, .mdd): not read yet. Requires a schema-specific reader and matching responses; XML alone does not identify a survey schema.
- Fixed-width data (.dat, .asc): not read yet. Requires a matching column layout. Export a delimited response table.
- Vendor projects and archives (.lsa, .qpack, .qdat, .omv, .jasp, .zip, .ddf, .dtas, .sas7bcat): not read yet. Export a supported response file from the source application.
Delimited text: encoding, delimiters and headers
- Text is decoded as UTF-8, or as UTF-16 when the file starts with a UTF-16 byte-order mark. A leading UTF-8 byte-order mark is removed. Files in other encodings are rejected rather than misread.
- Comma, tab, semicolon and pipe delimiters are tried and the one that produces a consistent table is used. If two delimiters fit equally well, or the header is uncertain, you are shown a preview to confirm the header row and delimiter.
- Title or metadata rows above the table are detected and excluded, and noted in the import summary. The header must be within the first 128 records.
- Blank lines are skipped. Empty cells become missing values.
- Blank headers are named “Column 1”, “Column 2” and so on by position; surrounding spaces are trimmed. Duplicate headers are renamed with a suffix such as “Q1 (2)” so no column is overwritten.
- Values become numbers only when written as a canonical number, so leading-zero codes and integers too large to represent exactly stay as text.
- A Qualtrics three-row header export is recognized by its ImportId row; the question-wording row becomes variable labels and neither row is counted as a respondent.
- If the last row looks like a totals row (its numbers equal the sum of the rows above), you are asked whether to keep or exclude it.
Excel and OpenDocument workbooks
- The worksheet with the most filled cells is read, so cover, notes and summary tabs are skipped. The import notes name the sheet used and the sheets not imported; sheets are never combined, and there is no option to pick a different sheet.
- The header row is detected the same way as for text files, with a preview when it is uncertain. Fully blank rows are skipped.
- Dates are converted to ISO 8601 text, TRUE/FALSE become “true”/“false”, and numbers stay numeric.
- Saved formula results are used and nothing is recalculated. Formula cells with no saved result and error values such as #N/A are imported as missing, and macros in .xlsm files are never run.
- Zipped workbooks (.xlsx, .xlsm, .xlsb, .ods) are checked before they are expanded: at most 10,000 internal entries and 256 MB uncompressed.
- Password-protected or encrypted workbooks are refused with instructions for removing the password. HTML or Excel 2003 XML exports named .xls are not read; save them as .xlsx. Flat OpenDocument .fods files are read like .ods.
SPSS .sav and other statistical files
- Variable labels are shown in place of short variable names, and value labels are applied as a display dictionary while the raw codes stay intact.
- System-missing values arrive as missing. Discrete numeric user-missing codes and numeric missing-value ranges (for example 97 THRU 99) are applied, and the import notes list the codes each range covered.
- String missing-value definitions are rejected with an explanation, rather than imported with different bases.
- The .sav reader cannot read SPSS measurement levels or roles. Numeric variables without value labels default to scale and others to nominal; review the dictionary after import.
- .zsav, .por, .dta, .sas7bdat and .xpt files are read by a separate reader that keeps measurement levels where the file declares them. Date formats become calendar dates, and SAS catalogs and complex survey designs are not applied automatically.
See open a .sav file without SPSS for a walkthrough.
R, Parquet, Arrow and SQLite files
- R .rds files (saveRDS) and .RData or .rda workspaces (save) are read in serialization versions 2 and 3, gzip-compressed or uncompressed. Data frames, tibbles and data.tables are imported; other objects in a workspace are listed in the import notes and not imported.
- R factors keep their level order: codes 1, 2, 3 … carry the levels as value labels, and ordered factors are marked ordinal. Date columns become calendar dates and POSIXct date-times are shown in the time zone the file records. NA values arrive as missing.
- haven-labelled columns (for example from read_sav) keep their value labels, their variable label and their declared missing codes and ranges.
- Parquet files are read with snappy, gzip, zstd, brotli or LZ4 compression. Dates and timestamps become calendar dates, decimals become numbers, nulls become missing, and integers too large to represent exactly are kept as text. Nested list, map and struct columns are imported as JSON text. Parquet does not store the order of categorical levels.
- Arrow IPC files and streams and Feather version 2 files are read uncompressed or with LZ4 or zstd compression. Dictionary-encoded (categorical) columns keep their categories, in order, as value labels.
- SQLite database files (.sqlite, .sqlite3, .db) are opened read-only in the browser. When the file holds several tables or views you choose one in the preview; nothing is sent to a database server.
- When an .RData workspace holds several data frames, you choose one in the preview. Data frames are never combined.
After import
- Each column is typed: all-numeric columns with 10 or fewer distinct values are treated as categories, other numeric columns as numeric, and ISO dates as dates. Review the inferred types.
- In text, Excel, JSON and .sav imports, select-all-that-apply questions exported as split columns or comma-separated answers are detected as multi-select sets.
- Files that look like aggregate reports (for example with campaign, CTR or impressions columns; per-person spend or sessions alone do not count) ask you to confirm that each row is one respondent before survey tests are enabled.
- A weight's meaning is never inferred from a column name.
Limits
| Limit | Maximum |
|---|---|
| File size (all selected files combined) | 50 MB |
| Respondent rows | 1,000,000 |
| Columns (variables) | 1,000 |
| Row × column values | 20,000,000 |
| Characters in one value | 32,768 |
| Total text characters | 100,000,000 |
| Distinct values per variable | 100,000 |
| Workbook uncompressed size (.xlsx, .xlsm, .xlsb, .ods) | 256 MB |
| Workbook internal ZIP entries (.xlsx, .xlsm, .xlsb, .ods) | 10,000 |
| Uncompressed size of R and Parquet data (.rds, .RData, .parquet) | 256 MB |
When a limit is exceeded, no respondent rows are imported. Table size after import has its own limits; see capacity.
Troubleshooting import errors
| Message | What to do |
|---|---|
| The selected files exceed the combined 50 MB import limit. | Split the file, drop unused columns, or export only the respondents you need. |
| text encoding could not be read. Export UTF-8 or BOM-marked UTF-16. | Re-save the file as “CSV UTF-8” (or UTF-16 with a byte-order mark). Other encodings such as Windows-1252 are not read. |
| The CSV has unbalanced or invalid quotes. No partial dataset was imported. | A quoted field is not closed. Fix the quoting or re-export the file from its source. |
| Response rows do not align with the selected header, or quotes are unbalanced. | Some rows have a different number of fields than the header. Check the header row chosen in the preview, or re-export the table. |
| Only one column was detected. | The delimiter was not recognized, or the file has one column. Export a standard comma-separated CSV with at least two columns. |
| The file could not be read as an Excel workbook. | The message says why: the file may be damaged or incompletely downloaded, or not a real workbook (for example an HTML or Excel 2003 XML export named .xls). Open it in Excel or LibreOffice and save it as .xlsx, or export UTF-8 CSV. |
| This workbook is password-protected. | Remove the password in Excel or LibreOffice (in Excel: File › Info › Protect Workbook › Encrypt with Password), save the workbook and import it again. |
| Unsupported SPSS user-missing definition … | String and other non-numeric missing-value definitions are rejected so bases are not silently changed. Recode them to explicit numeric codes or system missing and re-export. Numeric codes and ranges are applied automatically. |
| Unsupported SPSS long-string user-missing definition. | Recode string missing values to system missing in the source and re-export. |
| This file could not be read as an SPSS .sav file … | The file may be corrupted or an unsupported variant. Export it again from SPSS or PSPP, or save it as CSV. |
| Statistical file signature does not match its extension. | The file extension does not match its contents (for example a .dta renamed to .sav). Use the original extension. |
| This file contains declared multiple-response sets. | Statistical files with declared multiple-response sets need a dedicated mapping. Export the underlying response columns as CSV. |
| String missing-value ranges in … cannot be imported safely. | Recode string missing-value ranges to system missing in the source and export again. Numeric ranges are applied automatically. |
| Response JSON must be an array of flat objects. | Export responses as a JSON array of objects, or JSON Lines with one object per line. |
| Nested answer in response … | Flatten repeats and multiple answers into explicitly named columns. |
| This looks like an XLSForm questionnaire definition. | You selected the form definition. Choose the exported response dataset instead. |
| QSF contains questionnaire definitions, not responses. | Select exactly one response file, optionally with one QSF. |
| Import row / column / cell / string limit exceeded … | The file is larger than the limits above. No respondent rows are imported; reduce the file and try again. |
| This file contains 2 tables. Choose the table with one row per respondent. | An .RData workspace or a SQLite database holds several tables. Pick the one with one row per respondent in the preview; the others are not imported or combined. |
| This R file is compressed with bzip2 / xz … | Only gzip-compressed (R's default) and uncompressed R files are read. In R, save again with saveRDS(x, "data.rds") or save(x, file = "data.RData"). |
| This .rds file holds a … not a data frame. | The object is a vector, list, matrix or model, not a table. In R, convert it with as.data.frame() and save it again. |
| This is a Feather version 1 file … | Feather version 1 is an older format. Save it again as Feather version 2 (the default in current pandas and the R arrow package), or as Parquet. |
| DuckDB database files cannot be opened in the browser yet. | Export the table from DuckDB with COPY my_table TO 'responses.parquet' (FORMAT parquet); and import the Parquet file, or send the table through the local bridge with crosstabs connect --duckdb. |
| This browser cannot run the import worker. Use a browser with Web Worker support for files larger than 1 MB. | Imports run in a background worker. Use a current browser with Web Workers enabled. |
Questions
Frequently asked questions
Is my file uploaded when I import it?
No. The file is read in your browser, in a background worker where available, and is not uploaded to a Crosstabs server.
Why does my ZIP code or ID keep its leading zeros?
Delimited values are converted to numbers only when they are written as a canonical number. Values such as 02139 or very large integers are kept as text so identifiers are not changed.
Can I open an R workspace or a database with several tables?
Yes. When an .RData file holds several data frames, or a SQLite database holds several tables or views, the preview lists each one with its rows and columns and you choose the table that has one row per respondent. Only that table is imported.
Can I import a workbook with several sheets?
Yes. Crosstabs reads the worksheet with the most data, not necessarily the first, so cover, notes and summary tabs are skipped, and the import notes name the sheet it used and the sheets it did not import. Sheets are never combined, and the importer has no sheet picker: to analyze a different sheet, save it as its own workbook or export it as CSV.
Are SPSS measurement levels imported from .sav?
Not by the .sav reader: it applies conservative defaults (numeric variables without value labels are treated as scale, others as nominal) and shows a notice so you can review the dictionary.
Next steps