A blank line contains no characters, while a whitespace-only line may contain spaces, tabs or other Unicode separators. Whether those rows should disappear depends on the requested transformation. ListClean makes the dependency visible: trimming runs first, so a whitespace-only row becomes empty only when trimming is enabled; blank-line removal then decides whether that empty row stays.
Trimming changes edges only
For the line ` North Hall `, trimming produces `North Hall`; the space between the words remains. This is different from collapsing whitespace, which could change identifiers, aligned text or meaningful formatting. ListClean deliberately does not collapse internal runs. The trimmed-lines counter counts lines whose value changed, not the number of whitespace characters removed.
Blank removal depends on the trimmed value
With trimming off, a line containing three spaces is data and survives blank removal because it is not an empty string. With trimming on, the same line becomes empty and is then removed when blank removal is selected. This ordering is fixed across every route and language. The blank-lines-removed counter reports the rows removed after the trimming decision.
Line endings are normalized transparently
Windows CRLF and older lone CR line endings are normalized to LF before items are split. One final line terminator does not create a phantom extra item; two final terminators represent one real blank line before the end. Output always uses LF so copying is deterministic. ListClean does not detect CSV records or quoted newlines: every physical line break is an item boundary.