Skip to Content
RowSlice

Free Online CSV Filter

Filter a CSV File by Column Value

An export arrives with everything in it, and you need one country, one status, or the orders above a certain amount. Set the conditions and get a CSV of just those rows, out of a file Excel will not open.

  • Multi-GB files
  • Never uploaded
  • Free, no sign-up

In short: RowSlice's CSV filter keeps the rows that match the conditions you set — an exact value, a piece of text, a number range, or an empty cell — and writes them to a new CSV inside your browser, so the file is never uploaded. Conditions can be combined across columns, keeping a row when every one of them is true or when any one of them is, and the rows that were left out can be saved to a second file. Rows are copied as the text they were written in, in their original order, so nothing is rounded or reformatted on the way out. The file is read about 4 MB at a time and nothing is remembered from one row to the next, so the tool sets no row limit of its own.

How to Filter a CSV File

  1. Choose or drag in your CSV file and check the preview of the first rows.
  2. Set a condition: pick the column, pick the comparison — equals, contains, is greater than and the rest are in the table below — and type the value to compare it against.
  3. Press Add Condition for each further column, and choose whether a row is kept when every condition is true or when any condition is true. Tick Ignore upper and lower case and Ignore spaces at the start and end of values if the data was typed by people.
  4. Press Filter Rows and download yourfile-filtered.csv. The result tells you how many rows were kept and how many were left out.

If your file has no header row, untick First row is a header under Advanced Options. Columns are then chosen by position, and the first row is tested like every other row instead of being copied to the top of the result.

The Operators, and What Each One Matches

There are thirteen, and they fall into three groups: six that compare text, two that ask whether there is a value at all, and five that read the value as a number.

OperatorKeeps the row whenExample
equalsThe value is exactly the text you typedcountry equals DE
does not equalThe value is anything else, an empty value includedstatus does not equal Cancelled
containsThe text appears somewhere inside the valuenote contains refund
does not containThe text appears nowhere in the valueemail does not contain @test.
starts withThe value begins with that textorder_date starts with 2026-03
ends withThe value ends with that textemail ends with @acme.com
is emptyThere is no value, it is only spaces, or the row is too short to reach the columnphone is empty
is not emptyThere is at least one character that is not a spacevat_number is not empty
is greater thanThe value reads as a number and is above the one you typedamount is greater than 5000
is greater than or equal toThe value reads as a number and is above it or equal to itquantity is greater than or equal to 1
is less thanThe value reads as a number and is below the one you typedstock is less than 10
is less than or equal toThe value reads as a number and is below it or equal to itdiscount is less than or equal to 0
is betweenThe value reads as a number and sits inside the two you typed, either end includedamount is between 100 and 500

The six text operators compare text exactly, capital letters and spaces included, until you tick Ignore upper and lower case or Ignore spaces at the start and end of values. Both apply to your value and to the file's value alike, and neither changes what is written out: the rows in the result are the rows as they stood in the file.

The five numeric operators are the ones worth reading twice. Both sides are read as numbers, and a value that is not a number never matches a numeric operator — not is greater than, and not is less than either. It is not read as zero and it is not quietly skipped: an empty cell is neither above 100 nor below it, so both filters leave it out. 1200 is a number; 1,200, $1200, 1 200, N/A and - are text that looks like one. Each value that was there and could not be read as a number is counted, and that count is shown with the result, so a column that filters down to nothing says why rather than coming back empty and unexplained. Empty and missing values stay out of that count: they are absent rather than unreadable, and counting them would bury the values the count exists to point at. If a column is full of currency signs or thousands separators, filter it with contains or starts with instead, or take them out before you filter.

A comparison that needs a value but has none typed is left out of the run rather than applied, because an unfinished condition is not a rule: an is between counts as unfinished until both of its boxes are filled, and only is empty and is not empty need no value at all. If not one condition is finished, the run does not start. What you have typed is then checked before anything is read: a numeric operator with something that is not a number stops the run with a message naming the column and the value you typed, and no file is written — better than a result of zero rows that looks like an answer. One more number worth knowing: a numeric comparison is exact to 15 significant digits, so a 16-digit card or account number belongs in equals or starts with, where every digit is compared as text.

Values are compared as the text of the file, which is also why a date column is a text column here — see the question on date ranges below. If you are not sure what a column holds, how the country codes are actually written, whether the status column says Active or ACTIVE, or what range the amounts cover, the CSV analyzer reports how many different values each column holds, up to three examples of them, and the smallest and largest number, without writing a file.

Filtering on More Than One Column

One condition per column, and one choice that governs all of them: keep a row when every condition is true, or when any condition is true. Take three conditions — country equals DE, status equals Active, amount is greater than or equal to 5000 — against five rows:

countrystatusamountEvery condition trueAny condition true
DEActive8400KeptKept
DECancelled8400RemovedKept
FRActive120RemovedKept
FRCancelled90RemovedRemoved
DEActive(empty)RemovedKept

The last row is the numeric rule in practice: the amount is empty, so the third condition cannot match it. With every condition is true that is enough to drop the row; with any condition is true the country still matches and the row is kept.

Requiring every condition is what most people want, because each one cuts the file down further. Any earns its place on a single column, where it stands in for a list: there is no is one of operator, so to keep everything that is Shipped, Delivered or Refunded, put three equals conditions on the status column and keep a row when any condition is true. The two settings cannot be mixed in one run, so a rule like (country is DE and amount over 5000) or status is Escalated takes two runs: filter twice, merge the two results, then remove the duplicate rows that matched both. One condition has to be finished before the tool will run: with none of them filled in, the result would only be a copy of the file you already have, so the run does not start.

Extracting a Subset Instead of Splitting

Splitting by column value and filtering answer two different questions, and the difference is who the output is for. Splitting writes every group at once: one file per distinct value in a column, up to 10,000 files, so each of your forty store managers gets their own. Filtering answers the narrower question — just give me these rows — and gives you one file.

Three things push the choice one way or the other:

What you needUseWhy
Every group as its own fileSplit by column valueOne pass writes them all; filtering would be one run per group
One group, or a handfulThis toolOne output file, and the groups you do not want are never written
A rule that spans columns, or a number rangeThis toolA split groups by the exact values in one column, so amount over 5000 is not a split it can make

The 10,000-file ceiling is the other place the two part ways. Split by a column that turns out to be an ID or a date-and-time stamp and there are more groups than that, so the run stops and asks for a different column; filtering on the same column asks for the few values you actually wanted and never creates the rest. If what you need is smaller pieces rather than particular rows — a file that will fit an import limit, or one a spreadsheet will open — that is splitting into parts, which cuts by row count or size and keeps everything. And when any rows will do, because what you want is something small to test a script or an import on, taking a sample needs a number rather than a condition: the first rows, one row in every so many, or a fixed number drawn at random.

Keeping the Rows That Did Not Match

Tick Also save the rows that were left out to a separate file and the run writes two files instead of one: yourfile-filtered.csv with the rows that matched, and yourfile-not-matching.csv with the rest. Both begin with the header row. Every data row lands in exactly one of them, so the two counts add up to the rows in your file and nothing is left unaccounted for.

That is worth having for two reasons. The first is checking: a filter that keeps 41 rows out of 900,000 is either exactly right or quietly wrong, and the fastest way to tell is to page through the other file in the CSV viewer and see what was left out. The second is that it turns a filter into a two-way split in one pass — open tickets in one file and the closed ones in the other, this year's rows and everything older — without reading the file twice.

Your original file is never changed. Both results are new files, so if the filter was not the one you wanted, change the conditions and run it again. A filter that matched nothing still writes its file, with the header row and no rows under it, so a result of zero is something you can point at rather than a file that failed to appear.

Why Not Filter in Excel?

For a file that fits on a sheet, Excel's AutoFilter is a good tool and this one is not trying to replace it. You see the rows as you narrow them, you can undo, and you can sort and total what is left — none of which happens here. Filter, copy the visible rows to a new sheet, save, and you are done.

It stops working for two concrete reasons. The first is the sheet itself: a worksheet holds 1,048,576 rows and 16,384 columns, and a cell holds 32,767 characters. Past the row limit Excel loads the first 1,048,576 rows, warns that not all the data was loaded, and the filter then runs over the part it loaded — which looks exactly like a filter that ran over your file.

The second reason applies well below that limit: opening a CSV in Excel changes values before you have filtered anything. A code written 00742 is read as the number 742 and the leading zeros are gone, so a filter for 00742 finds nothing, because the column no longer contains it. A number of 16 digits or more is cut to Excel's 15 significant digits and displayed as something like 4.5E+15, which can leave two different account numbers looking like one value to filter on. Some product codes are read as dates. Save the filtered rows back to CSV and every one of those changes is saved with them.

RowSlice reads the raw text of the file and never interprets it, so a ZIP code written 00742 is still 00742 in the file that comes out, and equals 00742 matches it while equals 742 does not. A numeric operator is the one place those digits are read as a number, where they say 742. The delimiter and the line endings of your file are kept as they were, whether it is separated by commas, semicolons, tabs or pipes, and a file that is not UTF-8 comes out as UTF-8. The file is read about 4 MB at a time and each row is judged on its own, so memory does not grow with the file and there is no row ceiling to run into. Results are written to your browser's private storage on your own disk, within the allowance a browser gives one site, which in Firefox is about 10 GB. If the file is one you cannot open at all, how to open a CSV file that is too large for Excel covers what else is available, from free tools to one line of code. This tool is tested in current Chrome, Edge and Firefox on Windows.

Last updated .

FAQ

Frequently Asked Questions

How do I filter a CSV by a column value?

Choose or drag in the file, add a condition — the column, what to compare, and the value, such as country equals DE — and press Filter Rows. You get one file, yourfile-filtered.csv, with the header row and every row that matched. Rows come out in the order they were in, each copied as the text it was written in, so leading zeros and long ID numbers are unchanged.

Can I filter on more than one column at once?

Yes. Add a condition for each column and choose whether a row is kept when every condition is true or when any condition is true. Every condition narrows the file down — country DE and status Active and amount over 5000 keeps only the rows where all three hold. Any widens it, which is how you keep several values from one column: there is no is one of operator, so add three equals conditions on the status column and keep a row when any condition is true. What you cannot do is nest them, so (A and B) or C takes two runs.

I filtered on a number and got nothing back. Why?

Because the column is not numbers. The five numeric operators read both sides as numbers, and a value that is not one never matches — not is greater than, and not is less than either. 1200 is a number; 1,200, $1200, 1 200, N/A, - and an empty cell are not. Each value that was there and could not be read as a number is counted, and that count is shown with the result, so a column that filtered down to nothing tells you why; empty and missing values are left out of the count, because they are absent rather than unreadable. If the numbers carry currency signs or thousands separators, filter that column with contains or starts with instead, or take the signs out before you filter. If the value you typed is not a number, the run stops before it starts, with a message naming the column and what you typed.

Can I filter by a date range?

Not as dates. Every value is compared as text, and the numeric operators need a number, which 2026-03-01 is not. When dates are written the ISO way, year first, text matching does most of the work: starts with 2026-03 gives you March 2026, and 2026 gives you the year. A range that does not fall on a year, month or day boundary cannot be expressed. If the file also carries a timestamp as a plain number of seconds, filter on that column with is between.

Are “Active” and “active” treated as the same value?

Only if you ask for it. Tick Ignore upper and lower case and Ignore spaces at the start and end of values, and both are applied to the six text operators — equals, does not equal, contains, does not contain, starts with and ends with — on your value and on the file’s alike. Without them, Active, active and Active with a trailing space are three different values. The rows written out are the rows as they stood in your file; neither option changes anything in the result.

What counts as an empty value?

Three things: a value with no characters in it, a value that is nothing but spaces, and a row too short to reach that column at all. A short row is not treated as an error — the missing column is read as empty and the row is tested like any other. Is not empty is the exact opposite, so every row falls into one or the other. Spaces count as empty whether or not you tick Ignore spaces at the start and end of values.

Can I keep the rows that did not match?

Yes. Tick Also save the rows that were left out to a separate file and you get yourfile-not-matching.csv as well, with the header row and every rejected row. The two files divide your data rows between them: each row is in exactly one of the two, and nothing is lost. It is the honest way to check a filter before you act on the result, and it turns one pass into a two-way split — the open tickets in one file, everything else in the other.

Is there a limit on file size or number of rows?

The tool sets no row limit of its own. Each row is judged on its own conditions and nothing is remembered from one row to the next, so memory stays flat whether the file holds 10,000 rows or 500 million, and the file is read about 4 MB at a time rather than loaded whole. What you need is free disk space for the results, inside the allowance your browser gives one site — about 10 GB in Firefox. The rows you keep are at most the size of the original file, and if you also save the rows that were left out, the two files together come to about the size of the original plus a second header row.

Can I filter a file that contains personal data?

Yes. The file is read from your disk by code running in your own browser and is never uploaded, so a file of names, addresses or salaries stays on the machine it is already on, and the page keeps working with the connection switched off once it has loaded. There is no account and no copy on any server. Results are kept in your browser’s own private storage for this site until you start a new job, and anything left behind is removed after six hours the next time you use a tool.

Guides

More Tools

More CSV Tools

CSV Analyzer

Count the rows, list the columns and profile the values in a CSV too big to open.

CSV Viewer

Page through and search a CSV that is far too large for Excel, without uploading it.

Compare Two CSV Files

See what was added, removed and changed between two exports, matched on an ID column.

Take a Sample from a CSV

Pull the first rows, every Nth row or a random slice out of a huge file for testing.

Sample CSV File Generator

Download realistic test CSV files from 10 rows up to 20 GB, with messy values on request.

Split CSV into Multiple Files

Cut a CSV that Excel refuses to open into multiple files by rows, size or number of parts.

Split CSV by Column Value

One file for every store, region, client or status — straight from a huge export.

Merge CSV Files

Combine multiple CSV files into one, lining up columns by name, even when the result is too big for Excel.

Remove Duplicates from CSV

Delete repeated rows from millions of records, comparing whole rows or chosen columns.

Convert CSV to Excel

Make a real .xlsx file without losing leading zeros, long IDs or turning codes into dates.

Convert CSV to JSON

Turn a CSV into a JSON array or NDJSON, with every value kept exactly as written.

Convert JSON to CSV

Flatten a JSON array or NDJSON export into a spreadsheet-ready CSV.

CSV Validator

Find the broken rows, bad quotes, wrong encoding and duplicate IDs before an import fails.

Convert CSV to UTF-8

Repair garbled characters like é by converting to UTF-8, and switch semicolons to commas.