The naive approach to typing is to look at each cell individually: if it parses as a number, emit a number; otherwise emit a string. This produces JSON where the same column has numbers in some rows and strings in others, which breaks consumers that assume a column has a single type. FixTools takes the column-wide approach instead. It inspects every non-empty cell in a column, and only promotes the entire column to a more specific type when every cell parses cleanly as that type. A single non-numeric cell in an otherwise numeric column keeps the entire column as strings, which is the safe default because mixed-type fields are harder to consume than uniformly typed strings.
The type hierarchy works as follows. Boolean is checked first: a column where every non-empty cell is exactly true or false (case-insensitive) becomes boolean. Otherwise, integer is checked: a column where every non-empty cell parses as a signed integer becomes integer JSON. Otherwise, decimal is checked: a column where every non-empty cell parses under the JSON number grammar including decimals and scientific notation becomes JSON number. Otherwise the column stays as strings. Empty cells in any non-string column become null because there is no zero-value representation in JSON that means missing for numbers or booleans.
Special tokens like Yes, No, T, F, 1, and 0 are not auto-promoted to boolean by default because the same tokens can mean different things in different domains. A column labelled active with values yes and no is probably boolean intent, but a column labelled rating with values 1 through 5 is integer intent that happens to have rows of 1 and 0 elsewhere. The conservative default treats Yes and No as strings unless you explicitly enable a Boolean Tokens option that lists which tokens to accept. This avoids accidental type promotions that silently change the meaning of your data.
Currency, percentages, and units are not auto-stripped. A cell containing 100.00 USD stays a string because it cannot parse as a number under JSON syntax. If you want a numeric column, strip the units in the spreadsheet before exporting. This rule sounds restrictive but it avoids ambiguous decisions like whether to drop the units symbol or convert it into a separate field. Keeping the converter focused on structural parsing rather than data cleaning makes the pipeline easier to reason about: cleaning is the spreadsheet job and conversion is the structural job.