How to Filter a CSV by Multiple Keywords at Once — Free Tool
Table of Contents
Filtering a CSV by a single value is easy — Excel can do it. The hard case is filtering by a list of values: 50 product SKUs you need to keep, 300 bounced emails you need to remove, 12 states you want to target. In Excel, that requires a FILTER formula with nested OR conditions, or a helper column with COUNTIF against a named range. In pandas, it is a .isin() call that requires knowing Python. Neither is quick.
The free CSV Row Filter accepts a word bank — a list of keywords, one per line — and filters your CSV rows against all of them simultaneously. Paste in 500 keywords and it processes all 500 in one pass.
How the Word Bank Works
The word bank is a text area where you enter one keyword per line. Every keyword in the word bank is checked against the selected column in your CSV. A row "matches" if any keyword in the word bank matches that row's column value.
Example: you have a product CSV with a "Category" column. Your word bank contains:
hoodies sweatshirts fleece crewneck
Every row where the Category column contains any of those four terms is matched. You can then keep only those rows (extract a subset), remove them (suppress them), or highlight them for review.
The word bank can hold hundreds of keywords. There is no enforced limit — in practice, word banks of 500+ items work fine. The matching runs in the browser, so performance depends on file size and device speed, but most files under 100MB process in seconds.
Match Modes: Exact vs. Contains
The tool has two match modes:
Contains match — a row matches if the column value contains the keyword anywhere within it. "hoodies" matches "Premium hoodies", "Men's Hoodies", and "hoodies & sweatshirts". Good for searching within longer text values, tags, descriptions, and categories.
Exact match — a row matches only if the column value is exactly equal to the keyword (after optional case normalization). "hoodies" matches "hoodies" but not "Premium hoodies". Good for matching IDs, SKUs, email addresses, and codes where partial matches would cause false positives.
Use exact match when your keywords are identifiers (email addresses, product IDs, account numbers, ZIP codes). Use contains match when your keywords are terms that might appear inside longer values (category names, tags, descriptions, status fields).
Both modes have an optional case-insensitive toggle. With case-insensitive on, "Hoodies" matches "hoodies", "HOODIES", and "Hoodies".
Common Use Cases for Multi-Keyword Filtering
Suppression list removal — your word bank is a list of email addresses to exclude (bounced, unsubscribed, opted out). Set match mode to exact, action to "Remove matched rows." Every email on the suppression list is removed from your CSV in one pass. See the full walkthrough in the suppression list guide.
SKU or product extraction — you have a product catalog CSV and a list of 80 SKUs you need to pull out for a specific campaign or vendor. Word bank = 80 SKUs, exact match, action = "Keep only matched rows." Result: a CSV containing only those 80 products.
Geographic filtering — your lead list has a "State" column. Your word bank has the 8 states in your territory. Contains or exact match, keep only matched rows. Result: a CSV containing only leads in your territory.
Category or tag filtering — a content export with a "Tags" column. You want all posts tagged with any of 15 specific topics. Word bank = 15 topic names, contains match (since tags are usually comma-separated in one cell), keep only matched rows.
Status filtering — a CRM export with a "Status" column. You want only "Active" and "Trial" customers, not "Churned" or "Prospect". Word bank has two values, exact match, keep only matched rows.
Sell Custom Apparel — We Handle Printing & Free Shippingvs. Excel FILTER with Multiple Criteria
Excel's FILTER function can filter by multiple values, but the formula gets ugly fast.
For two criteria:
=FILTER(A1:D100,(B1:B100="Active")+(B1:B100="Trial"))
For 12 criteria, you chain 12 conditions with the + operator (OR logic in FILTER). For 50 criteria, the formula is unmanageable. And this does not work if the criteria are in another sheet or list — you would need ISNUMBER(MATCH()) instead:
=FILTER(A1:D100,ISNUMBER(MATCH(B1:B100,E1:E50,0)))
This works correctly but requires Excel 365 or 2021 (FILTER is not available in older Excel versions), requires keeping the criteria list in the spreadsheet, and produces a spilled array that may break other formulas. Saving back to CSV then requires copy-paste-as-values.
The browser tool: paste your keywords into the text area, select your column, click filter, download. No formula syntax, no version requirements, no spreadsheet overhead.
vs. Python pandas .isin()
The pandas equivalent for filtering by a list of values:
import pandas as pd
keep_list = ['Active', 'Trial', 'Pending']
df = pd.read_csv('data.csv')
filtered = df[df['Status'].isin(keep_list)]
filtered.to_csv('filtered.csv', index=False)
For a "contains any of these keywords" match (partial match), it gets more involved:
import re pattern = '|'.join(re.escape(k) for k in keyword_list) filtered = df[df['Column'].str.contains(pattern, case=False, na=False)]
Both approaches work correctly but require Python and pandas installed, require writing and running a script, and require knowing the exact column name in advance. For a one-off filter of a CSV file, the browser tool is faster from start to finish.
The browser tool is also the better choice when the CSV contains sensitive data (contact lists, financial data, employee records) that should not be processed on a cloud service or shared machine.
Reading the Stats Panel After Filtering
After clicking filter, the stats panel shows:
- Total rows — rows in the original CSV (excluding header)
- Matched rows — rows where at least one keyword matched
- Unmatched rows — rows where no keyword matched
- Keywords — how many keywords were in your word bank
- Keywords not found — keywords that did not match any row
The "Keywords not found" count is useful for diagnosing problems. If you filtered by 50 email addresses and 20 are listed as not found, those 20 emails are not in the CSV — either they were never in it, or there is a case or spacing mismatch. Switch to case-insensitive mode and re-run to see if that accounts for the missing matches.
Three download buttons let you get the result you need: the filtered result (matched or unmatched depending on your action mode), just the matched rows, and just the unmatched rows. You can get all three from one filter run without re-uploading the file.
Try It Free — No Signup Required
Runs 100% in your browser. No data is collected, stored, or sent anywhere.
Open Free CSV Row FilterFrequently Asked Questions
Is there a limit to how many keywords I can use in the word bank?
There is no enforced limit. In practice, word banks of several hundred keywords process without issue on modern devices. For very large word banks (thousands of entries) combined with very large CSV files, performance depends on your device. Most realistic use cases — suppression lists, SKU lists, geographic filters — are well within what the browser tool handles comfortably.
Can I filter on multiple columns at once?
The tool filters on one column per run. For multi-column filtering (match column A AND column B), run two passes: first filter on column A and download the result, then upload that result and filter on column B. For OR logic across two columns (match column A OR column B), that requires a different approach — the tool does not currently support multi-column OR filtering in one pass.
What if my keyword appears in the header row?
The tool treats the first row as a header and does not include it in the matching. A keyword that matches a column header will not cause the header row to be included in the matched results or removed from the output.
Can I save my word bank for reuse?
The tool does not save anything between sessions. To reuse a word bank, keep it in a text file on your computer and paste it in each time. For recurring suppression list operations, maintain the list in a plain text file and paste it in whenever you run a new filter.

