ChatGPT and CSV files
How to analyze a CSV with ChatGPT, and when SQL is better
ChatGPT analyzes a CSV by running Python on it, but caps spreadsheets at roughly 50 MB and gives Free users 3 uploads per day. For bigger files or exact answers, open CSVs up to 1.5 GB in rows.page, free and without signing up, and run SQL in your browser.
No file handy? Open CO2 emissions by country and year (50k rows, 14 MB).
Steps to upload and prompt a CSV in ChatGPT
Attach the file to a conversation and tell ChatGPT exactly what to calculate.
- Drop your
.csvfile into the ChatGPT message box, or pick it with the attachment button. - Name the exact columns you care about, how to group or filter them, and the output you want.
- Ask ChatGPT to show the Python code it runs and to print the total row count first.
For data analysis, ChatGPT writes and runs Python in a Jupyter notebook environment. That environment cannot make web requests, so upload the file itself instead of pasting a link.
ChatGPT CSV limits and supported file types
As of October 2026, OpenAI limits CSV and spreadsheet files to roughly 50 MB, depending on row size. The 2,000,000 token cap for text documents does not apply to spreadsheets. Upload counts are capped too:
- Every plan: up to 80 files every 3 hours, and failed attempts can count toward it.
- Free plan: 3 file uploads per day.
- Projects: 5 files on Free, 25 on Go and Plus, 40 on Pro, Business, Enterprise and Edu.
- Custom GPTs: 20 knowledge files.
For analysis, ChatGPT reads CSV, TSV, XLS, XLSX, JSON, XML, YAML, Markdown, TXT and PDF. Parquet is not on the list, but rows.page opens it.
How to verify ChatGPT CSV accuracy
OpenAI's own advice is to review the generated code, outputs and assumptions before you rely on a result. It also notes that ChatGPT may pick a method that doesn't match your intent on the first try.
- Ask for the code behind every step, so you can check the exact filters and aggregations.
- Have it print the row count right after loading, and compare that with the source file.
- Open the same CSV in rows.page. The Columns panel shows each column's type, distinct count, share of empty values, min and max, and top values, so wrong numbers stand out.
Privacy: uploading to ChatGPT vs opening in rows.page
Attaching a CSV sends it to OpenAI's servers. Whether OpenAI may use it to improve its models depends on your plan and data settings; business offerings such as ChatGPT Enterprise and the API are excluded. If the file holds customer emails or financial records, check your company's data rules first.
In rows.page, DuckDB-WASM reads the file inside your browser. Nothing is uploaded while you scroll, filter or run SQL, only when you press Share.
When to run SQL in rows.page instead of asking ChatGPT
If you already know the count, filter or group-by you need, write it yourself and get an exact answer you can rerun. For quick checks, use the filter language: country:NL, price:>20, name:* (has a value) or -name:* (empty).
For aggregations, type one DuckDB SQL statement that starts with SELECT, WITH or FROM. The table is called data:
SELECT country, count(*) AS orders FROM data GROUP BY country ORDER BY orders DESCThe Columns panel skips mean, median and standard deviation, so use avg(), median() and stddev(), or profile every column at once:
FROM (SUMMARIZE data)SQL results show up to 1,000,000 rows. Window functions, QUALIFY and unnest() work, and column names with dots need double quotes, like "user.city".
| Task | ChatGPT | SQL in rows.page |
|---|---|---|
| Max CSV size | About 50 MB, depending on row size | Up to 1.5 GB per browser tab |
| Where data is processed | OpenAI's servers (the file leaves your machine) | Your browser via DuckDB-WASM (uploaded only if you press Share) |
| Exact counts, group by and filters | Writes and runs Python per prompt | Filter syntax (country:NL, price:>20) and DuckDB SQL on data |
| Column profiling | Ask in chat and wait for the script | Columns panel (type, distinct count, empty %, min/max, top values) plus FROM (SUMMARIZE data) |
| Parquet files | Not on the supported list | Opens with no browser size check |
Excel (.xlsx, .xls) | Supported | Not supported (export as CSV first) |
Hybrid workflow: trim in rows.page, then upload to ChatGPT
When the CSV is over ChatGPT's ~50 MB cap, or you only want to send aggregates or a few columns to OpenAI, use both tools.
- Drop the large CSV or Parquet file onto rows.page.
- Filter the rows, or run a
SELECTthat keeps only the columns and rows ChatGPT needs. - Open Export and choose CSV. A filtered view exports every matching row, a SQL result up to 1,000,000 rows.
- Or export Markdown, a table of the first 1,000 rows you can paste straight into a prompt.
- Upload the smaller file to ChatGPT, so you stay under the cap and spend fewer uploads.
rows.page limits and prices
| What | Limit or price |
|---|---|
| Open a file in your browser | Files up to 1.5 GB, $0, no account, nothing uploaded |
| Share a link without an account | $0, files up to 100 MB, link deleted 7 days after creation |
| Free account | $0, 10 datasets kept, last 3 versions |
| Pro | $12/month, 100 datasets, files up to 500 MB, private links |
| Max | $39/month, 1,000 datasets, files up to 2 GB, private links |
Questions
Can ChatGPT read a CSV from a URL link?
Not for data analysis: the Python environment cannot make web requests, so it can't download files from links. In rows.page, you can open a public file URL by putting it after rows.page/, for example https://rows.page/https://example.com/data.csv, and nothing is stored.
How do I remove duplicate rows from a CSV in rows.page before uploading to ChatGPT?
The data table has a hidden __rid row-number column, so run SELECT DISTINCT * EXCLUDE (__rid) FROM data in the SQL box. Then open Export and choose CSV to save the result, up to 1,000,000 rows.
What happens if my CSV is over 1.5 GB in rows.page?
A CSV, TSV or JSONL file bigger than 1.5 GB loads partially, with the note "Loaded the first N rows: the file is X, more than the browser can hold." A .json file over 1.5 GB is refused ("Too big for this browser"), while Parquet files are not held to the 1.5 GB check.
Does rows.page change my CSV formatting when I export a trimmed file?
CSV exports are comma-delimited UTF-8 without a BOM, with a header row, and there is no delimiter, encoding or BOM option. Cells starting with =, +, -, @, a tab or a carriage return get a leading apostrophe so spreadsheets don't run them as formulas.
Can I share a filtered CSV view with a coworker without them uploading it to ChatGPT?
Yes. Press Share to upload the file and get a https://rows.page/<10-character id> link; the filter, sort and visible columns travel in the URL, so Copy link on the dataset page shares your exact view of the whole file. Without an account, files can be up to 100 MB, you get 50 pushes and 1 GB per IP address per UTC day, and links expire after 7 days.