Back to Blog

07030 Was Not 7030

September 22, 2026
Share:
07030 Was Not 7030

I pasted a short sheet and the same id was on two rows. I wanted the second row named before anything deleted it. The id was 07030. If a reader turns that into a number, the zero is gone and 07030 and 7030 look like the same row. They are not.

The sample on the new page has eight data rows under a header. With the key set to the id, and with the first copy kept, four data rows stay and four are listed as the ones that would go. The box I pasted into still has all eight. The file changes when I download.

The page is Remove Duplicate Rows.


The paste does not get edited

I have used the spreadsheet command that removes duplicates. It works on the sheet in front of you. The extra rows are gone when the dialog closes, and the only number you get is a count. If the key was the wrong column, you find out by noticing a city disappeared.

This page does the preview first. The sheet sits in a box you can still edit. Under it, one table is the rows that would stay, in the order they already had. The other table is the rows that would go, with the original row number and the row number of the copy that was kept. Nothing in the box is rewritten to match those tables.

Download kept rows is the step that writes a file. Download removed rows writes a report with the source row, the kept row, and the cells. Copy kept rows puts the same text on the clipboard. If the clipboard is blocked, the tables are still on the page. Undo puts the previous paste back. Clear sheet empties the box, and that can be undone too.


What eight rows become

The sample is this text.

id,city 07030,Hoboken 07030,Hoboken 00123,Newark 00123,Jersey City ,Blank ,Blank =SUM(A1),formula =SUM(A1),formula

The first row is the header, so it is not compared. That leaves eight data rows. The default key is the first column, the id. The default rule is keep the first copy.

Walk it from the top. Row 2 is 07030 in Hoboken. Row 3 is the same id and the same city, so row 3 is listed as removed and the kept row is 2. Row 4 is 00123 in Newark. Row 5 is the same id in Jersey City. If the key is only the id, row 5 goes and the kept row is 4. Row 6 has an empty id. Row 7 has an empty id too, so row 7 goes and the kept row is 6. Row 8 is the text =SUM(A1). Row 9 is the same text, so row 9 goes and the kept row is 8.

Four data rows stay: 07030, 00123, the empty id, and =SUM(A1). Four rows are listed: 3, 5, 7 and 9. The download of the kept rows starts with the header and then 07030,Hoboken. The characters 07030 are still in that file. So is =SUM(A1),formula, with no quote stuffed in front of the equals sign.

KeyRuleData rows that staySheet rows listed as removed
idfirst copy43, 5, 7, 9
idlast copy42, 4, 6, 8
id and cityfirst copy53, 7, 9

Those three lines are the whole sample. I counted them from the preview, not from a guess about what a spreadsheet would do.


Keep the last row where it already sits

Keep the last copy does not move the survivor to the top. It walks the sheet, remembers the latest row for each key, and leaves that row where it was. The earlier copies are the ones listed.

On the sample, with the key still set to id, the kept id 07030 is still Hoboken, because both copies were Hoboken. The kept 00123 is Jersey City, which was row 5, and Newark is the row that would go. The kept blank is the second blank. The kept formula is the second formula. The removed sheet rows are 2, 4, 6 and 8.

The kept file is still in the original order. Header, then Hoboken, then Jersey City, then the blank, then the formula. Pulling the last copy up to the first line would scramble a sheet of orders even when the key was right.

If you switch the radio and the preview looks wrong, switch it back. The paste has not moved. The download buttons stay off until a column is checked and the sheet was read whole. A cut sheet can be previewed, and the status says the preview is the part that was read.


Checking city changes the answer

00123 is on two rows, and the cities are not the same. Newark and Jersey City are both real rows if the key is the id plus the city. They are duplicates only if you decided the id was enough.

Check the city box and the kept count goes from 4 to 5. Jersey City moves out of the removed table and into the table of rows that stay. The duplicate 07030 is still removed, because both cells match. The second blank is still removed. The second =SUM(A1) is still removed. The removed rows are 3, 7 and 9.

Uncheck every column and the page stops. The status says to pick at least one column. The download buttons are disabled. I did not want a silent "remove everything" or a silent "keep everything" that looked like success. An empty key selection is a mistake, and the mistake should sit on the screen.

The header checkbox is the other half of this. If the first row is data, turn the checkbox off or the words id and city become a row that can match a later row of the same words. The sample has that header on purpose, so you can see the difference.


The zero is a character

07030 and 7030 are different strings. A reader that calls Number() on the cell will hand you 7030 for both, and then a duplicate check will treat them as one row. The zero was the whole point of the id. A zip code does this. So does an order number that was printed with the zeros filled in.

This reader never calls Number() on a cell. The writer does not look at what a value means either. It quotes a field when the text contains a comma, a quote, or a line break. 07030 needs none of that, so it is written as 07030. I checked the round trip on the sample. The second line of the kept file is 07030,Hoboken.

A space is part of the id too. " 07030" with a space in front is not the same key as 07030. The page does not trim. If you wanted the space gone, delete it in the box. I would rather show you a near miss than quietly decide it was a match.

Case works the same way. Ada and ada stay as two rows. If they should be one row, change the case first and paste the result back. The page says so, next to the link for that.


=SUM(A1) is not calculated

The last two sample rows are the characters =SUM(A1) in the id column and the word formula in the city column. This page does not evaluate that. There is no grid of numbers behind the paste, and there is no result to put in the cell. The two rows match because the text matches.

Some writers try to be helpful here. They see a cell that starts with = and they put a single quote in front, so a spreadsheet will not treat the text as a formula later. That changes the file. The kept download from this page contains =SUM(A1),formula and it does not contain a quote before the equals sign. I checked that on the sample export.

If you needed the sum, this is the wrong page. Paste the values, not the formula, or leave the formula as text and open it somewhere that calculates. I will not pretend a text box ran a spreadsheet.


Two blank keys are the same key

An empty cell is a value. Two empty ids are the same key, so the second row is a duplicate of the first. The sample shows this with a pair of rows whose id is empty and whose city says Blank. One stays. One is listed.

The preview prints (empty) in a blank cell so you can see the hole. That word is only on the screen. The download has the empty field, which in this sample is the comma at the start of the line: ,Blank.

I almost treated a blank as "skip this row." That would hide a repeated missing id, which is often the bug you came here to find. A missing order number on two lines is a duplicate of nothing, and you should see both lines before one of them disappears.

A blank line, meaning a line with no characters between the line breaks, is a different thing. The reader drops those and does not count them as rows. If it drops any, the note above the tables says how many. The sample has none, so the note stays hidden. If your export has a blank line between records, you will see the count instead of wondering why the row numbers jumped.


I read the Papa Parse docs and did not add the library

The queue for this page named Papa Parse. I opened the documentation on 21 September 2026 before deciding. The parse config has a switch called dynamicTyping. The docs say this:

If true, numeric and boolean data will be converted to their type instead of remaining strings.

They also say numeric data has to conform to a decimal literal, and that values greater than 2^53 or less than -2^53 are left as strings so the precision survives. 07030 is nowhere near that boundary. A conversion to a number is the loss this page exists to avoid, so I did not want that switch in the path. The default is false. I still did not add the library.

The same docs describe escapeFormulae on the way back out. If that option is on, a field that begins with =, +, -, @, a tab, or a carriage return is prefixed with a quote. That is the rewrite I refused in the formula section.

The site already has a CSV reader. It keeps every cell as a string, it can stop at a row limit, and it can be cancelled. I used that. I did not add a second parser.

The cap on this page is 2,000,000 characters, or 20,000 rows, whichever you hit first. Past that, the page stops and says so. It does not parse a slice and call the result the whole sheet. A workbook that starts with the ZIP marker PK is refused before any row is read. There is no progress spinner for a paste that fits. The work is the preview you are looking at.


A workbook is the wrong paste

An .xlsx file is a ZIP of XML. Opening those bytes as text gives you garbage, and a duplicate check on garbage is a confident wrong answer. If the file name ends in .xlsx, .xls, or .xlsm, the page does not read it. If you paste the ZIP marker yourself, the same refusal shows up. Save the sheet as CSV, then paste or open that file. The page keeps the characters you saved.

Tabs are fine. If the first lines split cleanly on tabs, the reader uses a tab. A one column list, a name on each line and no comma anywhere, is one column. Check that column. The same rules apply.


The share link is the knobs

Copy settings link builds an address with three knobs. keep is first or last. header is 1 or 0. cols is the column numbers, joined with a dot, so column 1 and column 3 are 0.2 because the count starts at zero. Open that address and those knobs come back.

The sheet is not in the link. I checked the sample. The address contains keep=last when that radio is on, and it does not contain 07030 or Hoboken. A ?v= on the end is a cache buster. It does not replace the knobs stored in this browser.

What this browser does remember is the knobs, under the key softery.remove-duplicates-excel.settings. Clear settings puts keep first, a header, and column 1 back, and removes that store. The paste is not in that store. Close the tab and the sheet is gone.

Mixpanel and Google Analytics load with Softery.io. They see that someone opened the tool and which knob moved. A size bucket and a row count go out with a copy or a download. The cells do not. I will not tell you the whole site makes no requests. The sheet does not leave with them.


After the download

When the kept file looks right, two pages are the useful next step. Neither of them is a signup.

The CSV Viewer and Editor opens the file you just downloaded. Fix a cell there. That page uses the same idea about text: a leading zero stays a leading zero. If the preview here was right and one city is still spelled wrong, edit it there instead of pasting the whole sheet back through a spreadsheet.

The Text Case Converter is the page to open before this one, when Ada and ada should count as one row. This page will not fold case for you. Change the case, copy the result, paste it here, and then look at the removed table.

Do it in this order.

  1. Paste the sheet, or open a CSV. If you still have a workbook, save it as CSV first.
  2. Decide whether the first row is a header.
  3. Check the columns that count. Leave city unchecked only if two cities with one id should collapse.
  4. Read the removed table. The sheet row and the kept row are both there.
  5. If a row you need is in that table, change the key or switch to keep the last copy. The paste is still in the box.
  6. Download kept rows. Open the file if you want to see 07030 still written as 07030.

If the status says the sheet was cut at 20,000 rows, or the paste was over 2,000,000 characters, split the file and run the pieces. Do not download the preview and treat it as the whole export. The button for that download stays off when the read was cut.


Last updated: September 21, 2026 | Reading time: 12 minutes

Written by Softery.io, which would rather show you row 5 than congratulate you on a count.