๐ CSV Fundamentals ยท 8 min read
Excel CSV Separator Setting: Why Your Comma-Delimited File Has No Commas
Excel does not decide the separator when it saves a CSV. It writes the Windows list separator, and on a machine set up for a comma-decimal language that character is a semicolon. Microsoft's support documentation says the default is a comma, then documents how to change it in Region settings and warns that the change affects every application on the computer. So a file called report.csv, created through the menu item labelled CSV (Comma delimited), can contain zero commas and still be exactly what Excel promised to write.
This matters because the two failure modes look nothing alike. A parser that assumes commas frequently does not error โ it returns one column, or it silently splits the decimals off your numbers and keeps going. Below: how to see which character your file really uses, the two different ways to change it, what we measured, and the one case where changing the setting is the wrong fix.
The menu item describes the format, not the character
Microsoft's support article on importing and exporting text files is the primary source here, and it settles the question in one sentence:
"When you save a workbook as a .csv file, the default list separator (delimiter) is a comma. You can change this to another separator character using Windows Region settings."
Read that as a two-part statement. The default is a comma, and it is a default inherited from the operating system, not a property of the CSV format. When the same page tells you to pick a format in the Save As dialog โ "click Text (Tab delimited) or CSV (Comma delimited)" โ it is naming the format family. The character that ends up inside the file is whatever List separator is set to at that moment.
On most English-language installs that character is a comma, which is why the distinction stays invisible for years. On a German, French, Spanish, Italian, Dutch or Brazilian machine it is usually a semicolon, because those locales use the comma for the decimal point and therefore cannot also use it to separate fields.
How to check which separator your file uses (10 seconds)
Do not open the file by double-clicking. Excel will apply the current list separator as the delimiter and quietly put everything in one column, which tells you nothing about the bytes. Instead:
- Text editor. Open the first line in Notepad, TextEdit or any code editor. Commas between values, or semicolons, or tabs โ visible immediately. This is the whole diagnostic for a file under a few hundred megabytes.
- A tool that reports the delimiter. The CSV analyzer prints the delimiter it detected, the encoding, and the parsed row and column counts, so a mismatch shows up as a column count of 1 instead of a failed import three steps later.
- Count characters. A table with three columns has exactly two separators per line, whatever the character is. Our test file below is 52 bytes with eight semicolons and three commas โ and every one of those three commas is inside a number, not between fields.
Fix 1: change the Windows list separator (affects everything)
This is the change Microsoft documents first, and the one to think about twice. Windows 11:
- Select the Search bar and type Region Settings.
- Select Administrative language settings.
- Under the Formats tab, select Additional settings.
- In the Customize Format dialog, on the Numbers tab, type the character you want in the List separator box.
- Select OK twice.
On Windows 10 the path runs through Settings > Time & Language > Region > Additional date, time, and regional settings > Change date, time, or number formats > Additional settings, then the same List separator box on the Numbers tab. Older Windows versions put the same dialog under Control Panel > Clock, Language, and Region > Change date, time, or number formats.
Microsoft attaches a caution to this section that is worth quoting verbatim, because it is the part people skip:
"Changing the Windows setting will cause a global change on your computer, affecting all applications."
That is not boilerplate. Every program that formats numbers, dates or delimited text for that user changes behaviour at once โ including accounting exports, ERP clients and the scripts your team wrote last year against the old separator.
Fix 2: change it for Excel only
If the goal is "my Excel should write semicolons" and nothing else should move, Microsoft documents a trick that changes the number format instead of the separator:
"If you want to use a semi-colon as the default list separator when you Save As .csv, but need to limit the change to Excel, consider changing the default decimal separator to a comma - this forces Excel to use a semi-colon for the list separator."
- Clear Excel Options > Advanced > Editing options > Use system separators.
- Set Decimal separator to a comma.
- Set Thousands separator to a period.
The documentation adds the consequence in the same breath: this changes how decimal numbers are displayed in Excel, so also set the thousands separator to limit the confusion. You have traded one global setting for one workbook-wide setting. It is the right trade when you must produce files for a semicolon-consuming system and your colleagues must keep their commas.
What we measured
We wrote the same three-row table twice โ once US-style, once European-style โ and fed both to pandas with its default settings. Environment: Python 3.13.5, pandas 2.3.3, 2026-10-31, script kept at seo_geo_ops/nc_measure_20261031b/m2.py.
| File | Bytes | Semicolons | Commas |
|---|---|---|---|
us.csv (1,Kiel,12.50) | 52 | 0 | 8 |
eu.csv (1;Kiel;12,50) | 52 | 8 | 3 โ all inside prices |
Both files are 52 bytes and both are named .csv. Only one of them contains a comma between fields. Then we read the European file with pandas' default separator:
| Call | Result |
|---|---|
read_csv("eu.csv") | shape (3, 1), single column named id;name;price |
read_csv("eu.csv", header=None) | ParserError: Error tokenizing data. C error: Expected 1 fields in line 2, saw 2 |
read_csv("eu.csv", sep=";") | shape (3, 3), columns id/name/price, but price is object holding 12,50, 99,00, 7,25 |
read_csv("eu.csv", sep=";", decimal=",") | price becomes float64: 12.5, 99.0, 7.25 |
csv.Sniffer().sniff(eu.csv) | delimiter ; โ detection works, assuming does not |
Two details in that table are worth more than the labels. First, the wrong-separator read returned data instead of an error: pandas produced three rows with one column and printed a table where the price had been torn off the row and shown as a separate value. Silent corruption of that kind is worse than a crash, because nothing prompts you to look. Second, even the correct separator was not the end of the job: the prices arrived as text, because the decimal comma is a second setting the reader has to be told about. Any tool that claims to fix "the delimiter problem" without asking about the decimal character fixes half of it.
The comma-decimal trap: the semicolon exists for a reason
It is tempting to treat the semicolon as a mistake somebody made. It is not. In a comma-decimal locale, 12,50means twelve and a half, so a comma can no longer be trusted to mean "next column". The semicolon is the escape hatch that keeps numbers readable and fields separable at the same time. Remove it and you have to choose which of the two meanings to break.
That choice is what makes these files fail the CSV grammar rather than merely differ from it. RFC 4180, section 2 defines a record as fields separated by commas, and then states the rule that a comma-decimal export cannot satisfy without quoting:
"Fields containing line breaks (CRLF), double quotes, and commas should be enclosed in double-quotes."
A file containing the unquoted string 12,50 therefore is not a valid comma-separated file at all: it contains commas that are data, in fields that are not quoted. Anything that parses it strictly will either fail on the field count or split the number. This is precisely what our third test row showed โ the parser was not being pedantic, it was following the grammar it was given.
The practical consequence: never run find-and-replace on commas to "fix" a semicolon file from a comma-decimal locale. You will delete the decimal points and keep the structure, producing numbers that are wrong by a factor of ten or a hundred and a file that still does not parse. Convert by parsing first, then rewriting the field separators, which is what the delimiter converter does and what the safe rewrite in pandas walks through line by line.
When changing the setting is the wrong fix
Three situations where the operating-system change causes more trouble than it solves:
1. You are the only one who needs the other separator.The Windows list separator is per-user and machine-wide. If four colleagues receive your files and one system consumes them, changing your machine makes your files the odd ones out. Convert the files instead: the cost stays inside the file, not inside everybody's settings.
2. An importer upstream expects commas. Most uploads and APIs assume RFC 4180 CSV. If a portal rejects your file, changing your list separator to get a different delimiter out of Excel is not the repair you want โ you wanted the opposite. Read the field mapping first, then produce exactly the delimiter the receiver documents. If the site refuses the upload for other reasons, why a CSV gets rejected on upload covers the usual causes.
3. The file is already published or shared. A .csv sitting in a folder, an attachment or a data pipeline does not read the setting โ it reads bytes. Changing the setting only affects files you save next. Existing files must be converted individually, and that is a one-line job with sep in pandas or in the browser.
One habit prevents all of it: before sending a CSV, open it in a text editor and look at the first line. The character you see is the character the receiver's software will argue with. If you cannot tell, everything that causes one-column imports starts with the same two-question check, and the semicolon explainer covers the reader side of the same problem.
Frequently Asked Questions
Why does Excel save my CSV with semicolons instead of commas?
Because the separator is not chosen by Excel. Microsoft's documentation says that when you save a workbook as a .csv file the default list separator is a comma, and that you can change it to another character using Windows Region settings. On a machine configured for a comma-decimal locale the list separator is normally a semicolon, so Save As CSV (Comma delimited) writes semicolons. The menu name describes the file type, not the character inside it.
How do I know which separator my CSV actually uses?
Open the file in a plain text editor and look at the first line, or let a parser detect it: in our test Python's csv.Sniffer returned the comma for the US-style file and the semicolon for the European-style file. A tool that reports the delimiter it found, such as the CSV analyzer on this site, answers it in one step. Counting characters is already enough: the same two-line, three-column table has eight separators either way, but only one of the two files contains commas.
Is changing the Windows list separator safe?
Microsoft's own caution is explicit: changing the Windows setting will cause a global change on your computer, affecting all applications. It alters how numbers, dates and delimiters are formatted everywhere, including in programs and scripts that expect the previous separator. If you only need Excel to write a different delimiter, change it inside Excel instead of at the operating-system level, or export with an explicit delimiter so no machine setting is involved.
Can I change the CSV separator for Excel only?
Yes. Microsoft documents a workaround: clear Excel Options > Advanced > Editing options > Use system separators, then set the Decimal separator to a comma and the Thousands separator to a period. Their documentation states that this forces Excel to use a semi-colon for the list separator. The trade-off is that decimal numbers in Excel then display with a comma, so the same article suggests changing the thousands separator as well to limit the confusion.
Why does a semicolon CSV break in pandas, R or an importer?
Because those tools are not guessing, they are defaulting. pandas.read_csv assumes a comma unless you pass sep. In our measurement the default returned 3 rows by 1 column named id;name;price, and forcing the split with header=None raised ParserError: Expected 1 fields in line 2, saw 2. Passing sep=';' returned the intended three columns. Tools that sniff the delimiter, such as csv.Sniffer, recover on their own; tools with a fixed default cannot.
What is the real fix for files that will be shared?
Stop depending on the writer's machine. Either export with an explicit delimiter so the file is unambiguous for everyone downstream, or convert the file once, with proper quoting, before you send it. A find-and-replace on commas is not equivalent: in a comma-decimal locale the comma is part of the number, so replacing it destroys the values. A delimiter converter that parses fields first and rewrites the separator afterwards is safe, because it knows which commas are structure and which are data.
Sources
- Microsoft Support, Import or export text (.txt or .csv) files(retrieved 2026-10-31): "When you save a workbook as a .csv file, the default list separator (delimiter) is a comma. You can change this to another separator character using Windows Region settings"; the caution "Changing the Windows setting will cause a global change on your computer, affecting all applications"; the Excel-only workaround "consider changing the default decimal separator to a comma - this forces Excel to use a semi-colon for the list separator" together with Excel Options > Advanced > Editing options > Use system separators and the Decimal/Thousands separator fields; and the Windows 11 and Windows 10 paths to List separator under Customize Format > Numbers.
- RFC 4180, Common Format and MIME Type for CSV Files, section 2: records consist of fields separated by commas; the last field in a record must not be followed by a comma; "Fields containing line breaks (CRLF), double quotes, and commas should be enclosed in double-quotes." Retrieved 2026-10-31.
- Local measurement, 2026-10-31, Python 3.13.5 and pandas 2.3.3, script and raw output stored at
seo_geo_ops/nc_measure_20261031b/: two 52-byte files,us.csvwith 8 commas and 0 semicolons,eu.csvwith 8 semicolons and 3 commas (all inside price fields);read_csvdefault returned shape (3, 1) with the column namedid;name;price;header=NoneraisedParserError: Expected 1 fields in line 2, saw 2;sep=";"returned (3, 3) with price asobject; addingdecimal=","returned price asfloat64(12.5, 99.0, 7.25);csv.Snifferidentified;correctly.
Convert the Separator, Not the Machine
The converter reads your file with the separator it actually has, then writes it back with the one you need โ quoting the fields that contain commas, so decimals survive the trip. Nothing on your computer changes.
Related reading
File Operations โ other guides that pair well with this one.
- Compare Two CSV Files Online
- Free CSV Viewer Online
- Convert CSV to Excel Without Excel
- Convert Excel to CSV Free Online
Browse all guides in the NoCodeCSV blog.