CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Does cleaning preserve commas and newlines inside quoted CSV fields?
Our narrow CSV parser measures preserved quoted commas, escaped quotes and an embedded LF after U+200B removal. The field text changes; preserving record structure does not prove the value is intended.
Open the Claude text cleaner · Full measured data
Measured inputs and outputs
These are locally constructed test strings, not evidence that Claude inserts these characters. We executed the saved homepage script snapshot with a minimal DOM harness and compared exact strings. The invisible-checkbox state and dash mode appear in each row. The observations below test this page's specific question. We make no detector-score or statistical-watermark removal claim.
| Fixture and mode | Input string and code points | Output and cleaner status | Observed before / after |
|---|---|---|---|
| Quoted comma direct string / keep / invisible true | "id,note\r\n1,\"A,B\""U+0069 U+0064 U+002C U+006E U+006F U+0074 U+0065 U+000D U+000A U+0031 U+002C U+0022 U+0041 U+002C U+200B U+0042 U+0022 | "id,note\r\n1,\"A,B\""Removed 1 invisible character | {"rows":[["id","note"],["1","A,B"]],"balancedQuotes":true,"recordCount":2,"fieldCounts":[2,2]}{"rows":[["id","note"],["1","A,B"]],"balancedQuotes":true,"recordCount":2,"fieldCounts":[2,2]} |
| Quoted newline direct string / keep / invisible true | "id,note\r\n1,\"A\nB\""U+0069 U+0064 U+002C U+006E U+006F U+0074 U+0065 U+000D U+000A U+0031 U+002C U+0022 U+0041 U+000A U+200B U+0042 U+0022 | "id,note\r\n1,\"A\nB\""Removed 1 invisible character | {"rows":[["id","note"],["1","A\nB"]],"balancedQuotes":true,"recordCount":2,"fieldCounts":[2,2]}{"rows":[["id","note"],["1","A\nB"]],"balancedQuotes":true,"recordCount":2,"fieldCounts":[2,2]} |
| Escaped quote direct string / keep / invisible true | "id,note\r\n1,\"A\"\"B\""U+0069 U+0064 U+002C U+006E U+006F U+0074 U+0065 U+000D U+000A U+0031 U+002C U+0022 U+0041 U+0022 U+0022 U+200B U+0042 U+0022 | "id,note\r\n1,\"A\"\"B\""Removed 1 invisible character | {"rows":[["id","note"],["1","A\"B"]],"balancedQuotes":true,"recordCount":2,"fieldCounts":[2,2]}{"rows":[["id","note"],["1","A\"B"]],"balancedQuotes":true,"recordCount":2,"fieldCounts":[2,2]} |
Measure parsed fields instead of splitting lines
Each fixture contains a header and one data record. Our observer recognizes doubled quotes and tracks quoted fields, so an LF inside quotes remains part of the note rather than creating an extra record. The comma fixture keeps its comma, the newline fixture keeps its embedded LF and the escaped-quote fixture keeps its literal quote after parsing. Cleanup removes U+200B from each note. The record count and two-field shape stay the same, while the exact data-field string changes. This distinction matters when validating an import.
The parser has a deliberately narrow scope
RFC 4180 provides the CSV quoting model linked below. Our helper supports the specific locally authored balanced fixtures, treats CRLF and LF outside quotes as record separators and reports quote balance. It is not a production CSV library, a full conformance test or a malformed-input validator. The embedded LF example records the helper behavior and does not assert strict RFC acceptance of every newline convention. This page concerns data fields, independently of the header matching problem covered in our existing CSV guide.
Verify the destination parser and field meaning
Keep the original file and import both versions using the destination CSV library. Compare record counts, field counts and exact data-field values, especially around quoted line breaks and doubled quotes. Review whether joining characters inside a note changes its intended words. A unchanged schema alone cannot establish semantic preservation. The homepage treats the source as plain text and does not parse CSV. These three fixtures establish quoting preservation for this callback and helper, without promising compatible behavior in every spreadsheet or importer.
Reproduce this test
Save reproduce.cjs and tested-app.js in the same folder. Run the command below with Node.js. The harness prints its runtime, script SHA-256 and every measured row. Compare those rows with the original record. Using a newer script or runtime creates a new experiment; retain the version information with your rerun.
node reproduce.cjsReference and next check
CSV records and quoting provides the relevant primary definition. The table and fixture analysis are original measurements. For broader inspection, use our Unicode inspector. Read the scope distinction before interpreting cleanup as a watermark result.