{"record":{"id":"09475b8f3dc32d58","repo":"dotnet/machinelearning","slug":"decimal-separator-cannot-match-the-column-separato","errorCode":null,"errorMessage":"Decimal separator cannot match the column separator","messagePattern":"Decimal separator cannot match the column separator","errorType":"validation","errorClass":"System.ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.Data.Analysis/DataFrame.IO.cs","lineNumber":663,"sourceCode":"        /// </summary>\n        /// <param name=\"dataFrame\"><see cref=\"DataFrame\"/></param>\n        /// <param name=\"csvStream\">stream of CSV data to be write out</param>\n        /// <param name=\"separator\">column separator</param>\n        /// <param name=\"header\">has a header or not</param>\n        /// <param name=\"encoding\">the character encoding. Defaults to UTF8 if not specified</param>\n        /// <param name=\"cultureInfo\">culture info for formatting values</param>\n        public static void SaveCsv(DataFrame dataFrame, Stream csvStream,\n                        char separator = ',', bool header = true,\n                        Encoding encoding = null, CultureInfo cultureInfo = null)\n        {\n            if (cultureInfo is null)\n            {\n                cultureInfo = CultureInfo.CurrentCulture;\n            }\n\n            if (cultureInfo.NumberFormat.NumberDecimalSeparator.Equals(separator.ToString()))\n            {\n                throw new ArgumentException(\"Decimal separator cannot match the column separator\");\n            }\n\n            if (encoding is null)\n            {\n                encoding = Encoding.ASCII;\n            }\n\n            using (StreamWriter csvFile = new StreamWriter(csvStream, encoding, bufferSize: DefaultStreamReaderBufferSize, leaveOpen: true))\n            {\n                if (dataFrame != null)\n                {\n                    if (header)\n                    {\n                        SaveHeader(csvFile, dataFrame.Columns.GetColumnNames(), separator);\n                    }\n\n                    var record = new StringBuilder();\n","sourceCodeStart":645,"sourceCodeEnd":681,"githubUrl":"https://github.com/dotnet/machinelearning/blob/7b76e69cf964daeca3f1377af6bc5543284d56c6/src/Microsoft.Data.Analysis/DataFrame.IO.cs#L645-L681","documentation":"SaveCsv writes columns separated by 'separator'; if the culture's NumberDecimalSeparator equals that separator, numeric values would be indistinguishable from column boundaries, corrupting the CSV. SaveCsv therefore throws ArgumentException('Decimal separator cannot match the column separator').","triggerScenarios":"Calling SaveCsv with separator ',' (or '.') combined with a culture whose NumberDecimalSeparator is the same character — classically a European culture where the decimal separator is ',' while writing comma-separated CSV, e.g. SaveCsv(df, path, separator: ',', cultureInfo: new CultureInfo(\"de-DE\")).","commonSituations":"European locales writing comma-delimited CSV; hardcoding separator ',' while relying on CultureInfo.CurrentCulture that uses ',' decimals; machines with regional settings differing from dev machines.","solutions":["Pass a cultureInfo whose decimal separator differs from the separator, e.g. CultureInfo.InvariantCulture","Use ';' as the field separator when targeting a comma-decimal culture","Force the decimal format explicitly instead of relying on CurrentCulture","Pre-validate the two separators in caller code before calling SaveCsv"],"exampleFix":"// before\ndf.SaveCsv(path, separator: ','); // de-DE machine: decimal sep is ','\n// after\ndf.SaveCsv(path, separator: ',', cultureInfo: CultureInfo.InvariantCulture);","handlingStrategy":"validation","validationCode":"var ci = cultureInfo ?? CultureInfo.CurrentCulture;\nif (ci.NumberFormat.NumberDecimalSeparator.Equals(separator.ToString()))\n    cultureInfo = CultureInfo.InvariantCulture;","typeGuard":null,"tryCatchPattern":"try { df.SaveCsv(path, separator: separator, cultureInfo: cultureInfo); } catch (ArgumentException ex) when (ex.Message.Contains(\"Decimal separator\")) { df.SaveCsv(path, separator: ';', cultureInfo: cultureInfo); }","preventionTips":["Always pass CultureInfo.InvariantCulture for machine-readable CSV","Prefer ';' separators in comma-decimal locales","Test CSV exports under multiple regional settings"],"tags":["csv","culture","argument"],"backgroundTag":"invalid-argument-value","analyzedSha":"7b76e69cf964daeca3f1377af6bc5543284d56c6","analyzedAt":"2026-09-11T12:35:38.930Z","contentChangedAt":"2026-09-11T12:35:38.930Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}