CSV cannot be parsed by splitting on commas, which is how most converters do it. A quoted field may contain a comma, a line break, or a doubled quote standing for a literal one, so the format needs a character-by-character scan that tracks whether it is currently inside quotes. Every exported spreadsheet hits this on the first address column, and a splitting parser silently produces a row with the wrong number of fields — which then shifts every subsequent column by one.
Type conversion is where a converter usually destroys data. The rule here is that a value only becomes a number when converting it back produces the identical string. 007 stays text, because Number("007") prints as 7. 1e5 stays text, 1.50 stays text, +1 stays text, and a nineteen-digit account id stays text because it is past the point where a JavaScript number is exact. That single round-trip test is the difference between a tool that converts your data and one that quietly corrupts zip codes and phone numbers.
Going the other way, the header row is the union of every key in first-seen order rather than the keys of the first record. A ragged array — where later objects carry fields the first one lacks — would otherwise lose those columns without a word. Fields are quoted only when they contain the delimiter, a quote or a line break, so the output stays readable, and a nested object is written as JSON rather than as the string "[object Object]". For nested JSON — dot-path columns, expanded arrays, formula escaping and a byte order mark for Excel — use the JSON to CSV converter, which is built for that direction.