How to remove unused columns from an analytics export
- Step 1Export the report as CSV — Download from GA4 (an exploration or report export), Amplitude (chart → export CSV), or Mixpanel (report → export). Keep the original; the tool produces a trimmed copy.
- Step 2Clean any metadata rows first if present — GA4's UI CSV often prepends
# ----------comment lines and a blank line before the real header. The remover treats the first row as the header, so strip those lines (open in a text editor and delete them, or re-export from the GA4 Data API which has no comment block) before dropping the file in. - Step 3Drop the file onto the remover above — Every header appears as a checkbox; parsing is local. Free handles up to 2 MB and 500 data rows — fine for a summary export, tight for a row-level event dump.
- Step 4Tick the columns you don't need — Select raw event parameters, all-zero metrics, internal IDs, and default dimensions your chart never uses. Remember you remove what you tick — to keep 4 KPIs from 30 columns, tick the other 26.
- Step 5Run and verify against your dashboard's field list — Click
Remove N columns, then confirm 'columns remaining' matches the fields your dashboard data source expects and scan the preview. - Step 6Load the slim file into your BI tool — Download
<yourfile>.columns-removed.csvand connect it as the Looker Studio / Tableau / Sheets data source — fewer fields, faster refresh.
Typical analytics-export columns: keep vs. remove
A starting split for a KPI dashboard. Exact column names vary by platform and report; match on meaning. Re-export rather than fight a malformed file where noted.
| Column type (example) | In your KPI report? | Action | Note |
|---|---|---|---|
Date, Week, Month | Yes | Keep | Time grain your charts trend on |
Sessions, Users, Conversions, Revenue | Yes | Keep | The actual KPIs |
Default channel group, Source/Medium | Maybe | Keep if you segment by it | Otherwise remove to slim the file |
Event parameters (event_param_*) | Rarely | Remove | Row-level noise in a summary dashboard |
| All-zero / empty metric columns | No | Remove | Metrics that don't apply to your segment |
Internal IDs (stream_id, property_id) | No | Remove | Plumbing, not analysis |
| Sampling/metadata flags | Context only | Keep one, remove the rest | Note sampling before you trim, then drop |
Platform export quirks that affect column removal
What to fix before trimming. General behaviour as of 2026 — verify against your platform's current export.
| Platform | Quirk | Effect on this tool | Fix |
|---|---|---|---|
| GA4 (UI export) | Prepends # comment lines + blank line before the header | First row isn't the real header → wrong checkboxes | Delete the comment block, or export via the Data API |
| GA4 (Data API / Sheets) | Clean header, sampled flag in a separate field | Works directly | Tick the sampling field if you don't need it |
| Amplitude | User-property columns + event metadata included | Lots of columns to tick away | Tick all non-KPI columns; remove in one pass |
| Mixpanel | Export may be comma or tab depending on settings | Delimiter auto-detected — no action needed | Output is comma-delimited regardless |
| Any platform | Row-level event dump (huge) | Easily over 2 MB / 500 rows on free | Aggregate before export, or split / use Pro |
Cookbook
Trimming real analytics exports to KPI sets. Values illustrative; the focus is which columns survive.
Trim a GA4 export to date + core KPIs
ExampleOnce the comment block is removed, tick the dimensions and IDs the dashboard doesn't use.
Input (after stripping GA4 # comment lines): Date,Sessions,Conversions,Revenue,stream_id,event_param_x 2026-06-01,1204,38,2410.50,4567,scroll 2026-06-02,1180,41,2602.00,4567,click Ticked to remove: stream_id, event_param_x Output (<file>.columns-removed.csv): Date,Sessions,Conversions,Revenue 2026-06-01,1204,38,2410.50 2026-06-02,1180,41,2602.00
Drop all-zero metric columns from an Amplitude export
ExampleAmplitude includes metrics that are zero for your segment. Remove the dead columns so the dashboard isn't cluttered with empty fields.
Input: Date,Active Users,Retention D7,Push Opt-ins,SMS Opt-ins 2026-06-01,8421,0.34,0,0 2026-06-02,8390,0.33,0,0 Ticked to remove: Push Opt-ins, SMS Opt-ins (all zero — no push/SMS) Output: Date,Active Users,Retention D7 2026-06-01,8421,0.34 2026-06-02,8390,0.33
GA4 comment block breaks the header — fix before trimming
ExampleIf you drop the raw GA4 UI CSV without cleaning it, the first row is a comment, not the header, so the wrong column names show up. Strip the metadata lines first.
Raw GA4 UI export (problem): # ---------------------------------------- # Sessions report # Created: 2026-06-09 Date,Sessions,Conversions 2026-06-01,1204,38 The tool reads row 1 (# ----------) as the header → columns are labelled wrong. Delete the # lines and the blank line first, so row 1 is: Date,Sessions,Conversions. Then trim normally.
Keep the sampling flag, drop the rest of the metadata
ExampleNote whether the data was sampled, keep that context column if useful, and remove the other plumbing fields.
Input: Date,Sessions,is_sampled,stream_id,property_id 2026-06-01,1204,true,4567,UA-90 Ticked to remove: stream_id, property_id (keep is_sampled for context) Output: Date,Sessions,is_sampled 2026-06-01,1204,true
Row-level event dump over the free caps
ExampleA raw event export with 50,000 rows blows past both free limits. Aggregate before exporting, or split.
Export: 50,000 event rows, 9 MB → over free limits (2 MB / 500 rows) Better: aggregate in GA4/Amplitude to a daily summary BEFORE export → ~30 rows, tiny file → trim freely. Or on Pro: trim the full 9 MB file directly. Or free: csv-row-splitter → trim chunks → csv-merger.
Errors and edge cases
Real errors and silent failures sourced from each platform's own documentation. Match the wording to the row, fix what the row says to fix.
GA4 UI export has comment lines before the header
Fix before trimmingGA4's UI CSV often starts with # ---------- comment lines and a blank line, so the first row the tool reads isn't the real header — the column checkboxes will be labelled from a comment. Delete the comment/blank lines in a text editor first, or export via the GA4 Data API / Sheets connector, which emits a clean header.
You remove what you tick, not what you keep
By designThere's no 'keep only KPIs' mode. To reduce a 30-column export to 4 KPIs, tick the other 26. The 'columns remaining' stat confirms you landed on the intended set. When most columns are noise, this is a lot of ticking — aggregating before export reduces both rows and columns.
Empty/all-zero columns are not auto-detected
ManualThe tool doesn't scan values to find empty or all-zero metric columns — you tick them yourself. Use the preview to spot columns that are blank or zero across the visible rows, then remove them. (Removing them is safe: it never touches the data in the columns you keep.)
Number formatting in kept columns is preserved exactly
PreservedRemoval is positional and text-based — it does not round, reformat, or re-localise numbers. A revenue value of 2410.50 stays 2410.50. Whatever number/locale formatting the platform exported survives unchanged in the columns you keep.
Export over 2 MB or 500 rows on free tier
Blocked (free limit)Free caps at 2 MB and 500 data rows. Row-level event dumps blow past both. Aggregate to a summary before exporting (best), use Pro, or split with csv-row-splitter, trim each chunk, and recombine with csv-merger.
Output is comma-delimited and has no BOM
ExpectedInput delimiter (comma or tab) is auto-detected; output is always comma-delimited UTF-8 with no BOM. Looker Studio, Tableau, and Sheets all read this fine. If a downstream tool insists on a BOM or tabs, convert after trimming.
Trimming doesn't remove blank rows in the export
Use a different toolSome exports include blank separator rows or a trailing total row. This tool removes columns only — blank rows pass through. Use csv-empty-row-remover to drop them as a separate step before loading the dashboard.
Two metric columns share a header
SupportedIf an export has two columns named Conversions (e.g. event-scoped and session-scoped), removal is positional, so each checkbox is distinct. They look identical in the preview — use column order to pick the right one to drop.
Frequently asked questions
Why does my GA4 export show the wrong column names in the picker?
GA4's UI CSV usually prepends # ---------- comment lines and a blank line before the real header. The tool reads the first row as the header, so it picks up a comment instead. Delete those lines in a text editor first, or export via the GA4 Data API / Sheets connector, which produces a clean header row.
Will removing columns change my KPI numbers?
No. Removal is positional and text-based — it never rounds, reformats, or re-localises values. The metric columns you keep are byte-for-byte identical to the export. Only the ticked columns are deleted.
Can the tool find and remove empty or all-zero columns automatically?
No — it doesn't inspect values. You identify the empty/all-zero columns (the preview helps) and tick them. The removal itself is safe and leaves your kept columns untouched.
Do I select the columns to keep or to remove?
To remove. There's no 'keep only these' mode, so to slim a 30-column export to 4 KPIs you tick the other 26. The 'columns remaining' stat confirms the result. Aggregating the report before export cuts the number of columns you have to tick.
How big an analytics export can I trim for free?
Free handles files up to 2 MB and up to 500 data rows; either over the cap blocks the run. A summary export is fine; a row-level event dump is not. Aggregate before exporting, use Pro, or split with csv-row-splitter and recombine with csv-merger.
Will the slim file load correctly in Looker Studio and Tableau?
Yes. The output is comma-delimited UTF-8 — the format both tools expect. Fewer columns means a faster refresh and a cleaner field list, which also stops analysts from charting a raw event column by accident.
Is my analytics data uploaded anywhere?
No. Parsing and column removal run entirely in your browser via PapaParse; the file never reaches a server. When signed in, only a content-free usage counter is recorded.
Does it remove blank or total rows from the export too?
No — only columns. Blank separator rows and trailing total rows pass through. Use csv-empty-row-remover to drop blank rows before loading the dashboard.
My Mixpanel export is tab-separated — does that matter?
No. The input delimiter is auto-detected (comma or tab), so a tab-separated Mixpanel export is parsed correctly. The output is comma-delimited, which BI tools read fine.
What does the downloaded file get called?
<your-original-name>.columns-removed.csv. Your source export is never modified, so you can re-run if you trim the wrong columns.
Should I keep the sampling/metadata flag?
Keep one sampling indicator if you want the context (so a chart isn't trusted as full data when it's sampled), and remove the other plumbing fields like stream_id and property_id. The tool lets you remove any subset of the metadata columns in one pass.
Can I automate this for a recurring dashboard refresh?
Yes. Pair the @jadapps/runner once and POST the export to 127.0.0.1:9789/v1/tools/csv-column-remover/run with options.columns listing the columns to drop by name (case-insensitive) or index. Combine with a scheduled GA4/Amplitude export to produce a trimmed dashboard source automatically — all on-device.
Privacy first
Processing runs locally in your browser with PapaParse. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.