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
- Choose or drag in your CSV file and check the preview of the first rows.
- 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.
- 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.
- 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.
| Operator | Keeps the row when | Example |
|---|---|---|
| equals | The value is exactly the text you typed | country equals DE |
| does not equal | The value is anything else, an empty value included | status does not equal Cancelled |
| contains | The text appears somewhere inside the value | note contains refund |
| does not contain | The text appears nowhere in the value | email does not contain @test. |
| starts with | The value begins with that text | order_date starts with 2026-03 |
| ends with | The value ends with that text | email ends with @acme.com |
| is empty | There is no value, it is only spaces, or the row is too short to reach the column | phone is empty |
| is not empty | There is at least one character that is not a space | vat_number is not empty |
| is greater than | The value reads as a number and is above the one you typed | amount is greater than 5000 |
| is greater than or equal to | The value reads as a number and is above it or equal to it | quantity is greater than or equal to 1 |
| is less than | The value reads as a number and is below the one you typed | stock is less than 10 |
| is less than or equal to | The value reads as a number and is below it or equal to it | discount is less than or equal to 0 |
| is between | The value reads as a number and sits inside the two you typed, either end included | amount 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:
| country | status | amount | Every condition true | Any condition true |
|---|---|---|---|---|
| DE | Active | 8400 | Kept | Kept |
| DE | Cancelled | 8400 | Removed | Kept |
| FR | Active | 120 | Removed | Kept |
| FR | Cancelled | 90 | Removed | Removed |
| DE | Active | (empty) | Removed | Kept |
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 need | Use | Why |
|---|---|---|
| Every group as its own file | Split by column value | One pass writes them all; filtering would be one run per group |
| One group, or a handful | This tool | One output file, and the groups you do not want are never written |
| A rule that spans columns, or a number range | This tool | A 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 .