Filter rows based on custom criteria and conditions
Filter CSV rows by condition, keep only the rows where a column equals, contains, is greater than, or matches a pattern you define. Think of it as a WHERE clause for your CSV.
Initializing in your browser…
From a global orders file you only want EU rows with a total above 100 for a regional report.
Filter
region == "EU" AND total > 100
Output
8,431 of 52,107 rows kept; original untouched
Multiple conditions combine with AND/OR across columns, so you carve the exact subset without a spreadsheet formula or SQL. The match count is shown immediately so you can sanity-check the filter before exporting.
Filter CSV rows by condition, keep only the rows where a column equals, contains, is greater than, or matches a pattern you define. Think of it as a WHERE clause for your CSV.
Unlike a flat list of conditions, this filter is built around a two-level boolean model that lets you express real expression trees. Each rule lives inside a Filter Group, and every group carries its own AND/OR toggle that combines the rules within it; a separate global AND/OR (the "Groups:" selector) then combines the groups themselves. The evaluator (evaluateGroup uses results.every for AND and results.some for OR, then the top level repeats that across activeGroups) means a configuration like "(status equals active AND price greater-than 100) OR (region in-list EU,UK)" is one group ANDing two rules and a second group, joined by a global OR. Groups can be duplicated wholesale (the Copy button clones every rule with fresh ids), and a live match counter shows "X of Y rows match" the moment you edit any rule, since previewData recomputes via useMemo on every change.
There are 17 operators organized into five labeled categories in the dropdown (Text, Numeric, List, Presence, Type Check). Text operators are equals, notEquals, contains, startsWith, endsWith and a regex matcher (compiled with new RegExp and the 'i' flag when case-insensitivity is on, returning false rather than throwing on an invalid pattern). Numeric operators are greaterThan, lessThan, greaterOrEqual, lessOrEqual and between (which reveals a second "Max" input, value2). The list operator inList splits your input on commas and trims each token, so typing "val1, val2, val3" matches any of the three exactly. Presence operators isEmpty/isNotEmpty test the trimmed cell, and three type-check operators classify values: isNumber (a parseable, non-blank number), isDate (driven by Date.parse), and isBoolean (true matches only the literals true, false, 1, 0, yes, no, case-insensitively). Each rule also has a per-rule "Aa" case-sensitivity toggle and an eye icon that disables the rule without deleting it, so you can A/B a clause; a disabled rule is treated as a pass (evaluateRule returns true when enabled is false).
Two precision caveats follow directly from the implementation. The numeric comparisons (greaterThan, lessThan, between, etc.) are guarded so that if either the cell value or your threshold is not parseable as a JavaScript Number, the rule simply returns no match rather than erroring, which means a stray currency symbol or thousands separator in a column will silently exclude those rows. And because isDate relies on Date.parse, ambiguous day/month strings can be misclassified. On the workflow side, files are parsed and re-serialized with PapaParse (skipEmptyLines on, with toast warnings for field-mismatch rows and hard stops on quote/delimiter errors), everything runs client-side via FileReader, and the result downloads as {filename}_rows.csv. You can also name and save filter setups within the session and export the entire rule tree to a filter-rules.json file (including globalLogic and an exportedAt timestamp) to version it or hand it to a teammate, who can re-import the same JSON to reproduce the exact filter. A built-in Products sample (Product, Category, Price, Stock, Rating across 8 rows) lets you try the operators immediately.
Pull out rows for a specific date range, region, or status from a larger dataset.
Filter out rows with empty required fields or values outside acceptable ranges.
Group 1 (logic AND): Price greater-than 100 AND Category equals Electronics. Group 2 (logic AND): Rating greaterOrEqual 4.5. Set the global Groups selector to OR to keep rows that are either pricey electronics or highly rated.
Add a rule on the Category column with the In List operator and type 'Accessories, Audio' -- the value is split on commas and trimmed, matching any row whose category is exactly Accessories or Audio.
Use the Is Number operator on the Price column to keep only rows whose Price parses as a non-blank number, dropping rows where that field is empty or non-numeric before downloading the filtered CSV.
Yes. Add as many conditions as you need and choose whether rows must match all of them (AND) or any of them (OR).
Yes. Select the regex operator and enter a JavaScript-compatible regular expression pattern.
Rows and columns are parsed and transformed in memory in your browser. No record ever reaches a server.