Compute CSV column statistics
Turn a column of CSV numbers into a compact statistical summary without opening a spreadsheet or writing a one-off script.
Run — free
Provide CSV text and the exact numeric column name, and this capability returns its minimum, maximum, arithmetic mean, median, and population standard deviation. It validates every selected cell before calculating, so missing columns, blank cells, labels, infinities, and other non-numeric values produce a clear error instead of a misleading partial result. Quoted fields, escaped quotes, configurable delimiters, and common line endings are handled deterministically.
Provide the CSV text and select one column
Start with CSV text whose first record is a header and whose remaining records contain the observations. Set column to the exact header you want to analyze. Header whitespace is ignored, but spelling and letter case otherwise matter, which prevents a request for one field from silently selecting another. Commas are used by default. If your file uses a semicolon, tab, pipe, or another one-character separator, pass it through the delimiter field. Standard quoted CSV values are supported, including delimiters and line breaks inside quotes as well as doubled quote characters. The parser treats every record after the header as data, so remove unrelated footer notes before submitting a file. A file must contain at least one data record. The response identifies the selected column and reports the number of observations alongside all five statistics, making it easy to confirm that the intended values were included before using the result in a report, validation rule, or automated import decision.
Understand the five returned statistics
Minimum and maximum describe the observed range. Mean is the arithmetic average: all selected values are summed and divided by their count. Median is the middle value after numeric sorting; for an even number of observations, it is the average of the two central values. Standard deviation is calculated as the population standard deviation, so squared distances from the mean are divided by the full observation count before taking the square root. This definition is appropriate when the CSV column is the complete population you intend to describe. If the rows are instead a sample used to estimate a larger population, apply a sample correction in your downstream analysis. Results use JavaScript numbers and are normalized to fifteen significant digits to avoid distracting floating-point artifacts while retaining useful precision. The capability does not infer units, remove outliers, weight observations, or reinterpret formatted currency. It summarizes exactly the finite numeric values supplied in the chosen column.
Use strict validation to protect downstream work
Reliable statistics depend on a consistently numeric input column, so validation is intentionally strict. The request fails when the named header does not exist or when any selected data cell is empty, missing, infinite, or not a finite number. It does not quietly skip bad rows, because silently calculating over a smaller dataset can produce a plausible but incorrect answer. Values such as currency symbols, thousands separators, percentages, and textual null markers should be normalized before this capability is called. The error identifies the column and, for invalid cell values, the one-based data-row position, which helps you find and repair the source record. This behavior makes the capability useful as a quality gate before ingestion: a successful result confirms both that the expected column exists and that every row can participate in the calculation. Computation is deterministic, requires no network access, and retains no file. Browser execution is convenient for an immediate check, while automated API requests cost $0.002 each.
What you can do with it
Check a measurement export
Summarize a sensor or laboratory column and compare its range and spread with expected operating limits.
Validate an incoming feed
Confirm a required numeric column exists and contains only usable values before importing the CSV.
Describe survey results
Calculate central tendency and population spread for a numeric response column without spreadsheet formulas.
FAQ
Which standard deviation is returned?
Population standard deviation is returned: variance is divided by the full number of observations before its square root is taken.
Are blank cells ignored?
No. A blank or missing cell in the selected column causes an invalid-input error so the statistics never represent an undisclosed subset.
Can the CSV use a separator other than a comma?
Yes. Supply any valid single-character delimiter, such as a semicolon, tab, or pipe.
Does it support quoted CSV fields?
Yes. Quoted delimiters, embedded line breaks, and escaped double quotes are parsed according to standard CSV conventions.
What does an API request cost?
Each API request costs $0.002. The browser version can run locally for interactive checks.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/data/csv-column-stats \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"csv":"name,score\nAda,10\nGrace,20\nLinus,30","column":"score"}'const res = await fetch("https://api.kit.forhosting.com/data/csv-column-stats", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"csv": "name,score\nAda,10\nGrace,20\nLinus,30",
"column": "score"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/data/csv-column-stats",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"csv": "name,score\nAda,10\nGrace,20\nLinus,30",
"column": "score"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/data/csv-column-stats", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"csv":"name,score\\nAda,10\\nGrace,20\\nLinus,30","column":"score"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"csv":"name,score\nAda,10\nGrace,20\nLinus,30","column":"score"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/data/csv-column-stats", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"csv": "name,score\nAda,10\nGrace,20\nLinus,30",
"column": "score"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.csv_column_stats",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_mb | 25 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |