Skip to content
datasquares.aiSign inStart free

Connect DataFiles & Apps

CSV Upload

You connect CSV Upload from the DataSquares connection wizard. Upload a .csv file — rows are imported into your workspace.

  1. In DataSquares, open Data Sources and choose Connect Source. The Connect a data source page opens.

  2. Pick CSV Upload on that page (search or browse by category).

  3. Name the source, choose the file, then choose Upload & Create.

Pick CSV Upload on the Connect a data source page and upload your file — no credentials needed. The file rows are imported into a staging table in your workspace and become queryable immediately.

  • First row = column headers; names are cleaned into valid field names.
  • The delimiter is detected from the file — comma, semicolon (European exports), tab (.tsv, Excel’s Unicode Text) and pipe all work.
  • Encoding is detected too: UTF-8 (with or without a byte-order mark), UTF-16 and Windows-1252 exports all keep their accented characters.
  • Column types are inferred from the data: integers, decimals, booleans, ISO dates and date-times, and day-first / month-first calendar dates when the values make the order unambiguous (15/01/2024 is day-first; a column where every value could be read either way stays text). Scientific notation becomes a floating-point number; values with leading zeros stay text.
  • Numbers written for a locale (1,234.50, 1.234,50, €12, 12%) are never guessed — 1,234 is a thousand in one locale and a decimal in another. Choose Numbers in this file when you upload: 1,234.56 (decimal point) or 1.234,56 (decimal comma). Thousands separators, a currency symbol before or after the number, a trailing % (12% imports as 0.12, as in Excel) and accounting negatives such as (1,234.50) are then read as numbers. Left on Standard, such columns import as text. A replacement uses the same choice unless you change it. Through the API, send numberFormat=dot or numberFormat=comma with the upload.
  • Date-times keep their meaning: a column whose values carry no UTC offset (2026-01-15 09:30) is stored exactly as written, with no time-zone shift for any reader; a column where every value carries one (…Z, …+05:30) is stored as an instant. One offset-less value makes the whole column offset-less.
  • A file can have at most 1,600 columns.

An upload is a snapshot. To update it, open the source’s Replace file action and upload the new file — the staged table is swapped in place under the same source, and dashboards built on it pick up the new data. Every replacement is listed in the source’s run history.

The replacement preview checks the same row, column and cell limits as the import. If it refuses a file, split the data or use a pipeline; the existing source remains available. Previewing a file does not change its staged data.

Before you confirm, the preview names what the new file would change: tables and columns added or removed, columns whose type changes, and the models and saved queries (with the dashboards behind them) bound to anything that goes. Approval is tied to the file you analysed — a different file, or a source edited in the meantime, is refused rather than replaced silently.

After the swap, the replacement reports what actually changed. A change that removes a table or column, or retypes one, is called out as breaking, because models and saved queries bound to what is gone will fail on their next query. POST /api/sources/{id}/replace returns that same schemaChange in its response, so an API caller that skipped the preview still learns what it did.

When you upload a file in the app, the upload itself is all you wait for: the file is stored on the server and imported in the background. A panel above your source list shows each import — reading the file, loading rows with a running count, publishing — and a Cancel button. You can keep working, reload the page or close the tab; the import carries on, and the panel picks it up again when you come back. A cancelled import leaves nothing behind. Replace file works the same way, with the progress and Cancel in its dialog; a cancelled replacement leaves the source unchanged.

API callers choose. The upload routes (and POST /api/sources/{id}/replace) stage the file within the request by default and answer 201. Add ?mode=async to get 202 with an import job instead, then poll GET /api/sources/ingest-jobs/{jobId} and cancel with POST /api/sources/ingest-jobs/{jobId}/cancel.

Multi-sheet workbooks → Excel upload. Very large or repeated extracts → connect the database they come from instead; uploads are best for one-off and occasional data.

The same steps work for Excel, JSON, Parquet and SQLite files.

  1. Open Data Sources and choose Connect Source.

    Open Data Sources and choose Connect Source.
  2. Pick where the data lives. Choose CSV Upload; Excel, JSON, Parquet and SQLite files work the same way.

    Pick where the data lives. Choose CSV Upload; Excel, JSON, Parquet and SQLite files work the same way.
  3. Name the source and choose the file. DataSquares detects the delimiter and encoding for you.

    Name the source and choose the file. DataSquares detects the delimiter and encoding for you.
  4. The file imports in the background and appears in the list with a status dot. You can keep working while it finishes.

    The file imports in the background and appears in the list with a status dot. You can keep working while it finishes.