{"record":{"id":"b7fa86a1d31c146a","repo":"dotnet/machinelearning","slug":"expected-either-0-or-1-to-be-provided","errorCode":null,"errorMessage":"Expected either {0} or {1} to be provided","messagePattern":"Expected either (.+?) or (.+?) to be provided","errorType":"validation","errorClass":"System.ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.Data.Analysis/DataFrame.IO.cs","lineNumber":369,"sourceCode":"        {\n            return CreateColumn(kind, GetColumnName(columnNames, columnIndex));\n        }\n\n        private static DataFrame ReadCsvLinesIntoDataFrame(WrappedStreamReaderOrStringReader wrappedReader,\n                                char separator = ',', bool header = true,\n                                string[] columnNames = null, Type[] dataTypes = null,\n                                long numberOfRowsToRead = -1, int guessRows = 10, bool addIndexColumn = false,\n                                bool renameDuplicatedColumns = false,\n                                CultureInfo cultureInfo = null, Func<IEnumerable<string>, Type> guessTypeFunction = null)\n        {\n            if (cultureInfo == null)\n            {\n                cultureInfo = CultureInfo.CurrentCulture;\n            }\n\n            if (dataTypes == null && guessRows <= 0)\n            {\n                throw new ArgumentException(string.Format(Strings.ExpectedEitherGuessRowsOrDataTypes, nameof(guessRows), nameof(dataTypes)));\n            }\n\n            List<DataFrameColumn> columns;\n            string[] fields;\n            using (var textReader = wrappedReader.GetTextReader())\n            {\n                TextFieldParser parser = new TextFieldParser(textReader);\n                parser.SetDelimiters(separator.ToString());\n\n                var linesForGuessType = new List<(long LineNumber, string[] Line)>();\n                long rowline = 0;\n                int numberOfColumns = dataTypes?.Length ?? 0;\n\n                if (header == true && numberOfRowsToRead != -1)\n                {\n                    numberOfRowsToRead++;\n                }\n","sourceCodeStart":351,"sourceCodeEnd":387,"githubUrl":"https://github.com/dotnet/machinelearning/blob/7b76e69cf964daeca3f1377af6bc5543284d56c6/src/Microsoft.Data.Analysis/DataFrame.IO.cs#L351-L387","documentation":"ReadCsvLinesIntoDataFrame requires either explicit column dataTypes or a positive guessRows count to determine column schemas. When both dataTypes is null and guessRows <= 0, it throws ArgumentException with Strings.ExpectedEitherGuessRowsOrDataTypes formatted as 'Expected either guessRows or dataTypes to be provided'. This is an argument-validation guard at CSV schema resolution.","triggerScenarios":"Calling ReadCsvLinesIntoDataFrame (directly or via LoadCsvFromString/LoadCsv) with dataTypes == null and guessRows <= 0, e.g. LoadCsv(stream, guessRows: 0) without dataTypes.","commonSituations":"Passing guessRows: 0 or -1 thinking it disables guessing; supplying dataTypes: null by accident after refactoring; copying a LoadCsv call and stripping arguments.","solutions":["Pass a positive guessRows value (default is 10) so types can be inferred","Or provide an explicit dataTypes array matching the number of columns","Check the call site to ensure dataTypes wasn't unintentionally null","Use LoadCsv's defaults rather than overriding guessRows with 0"],"exampleFix":"// before\nvar df = DataFrame.LoadCsv(stream, guessRows: 0);\n// after\nvar df = DataFrame.LoadCsv(stream, guessRows: 10); // or supply dataTypes: new[]{typeof(long), typeof(string)}","handlingStrategy":"validation","validationCode":"if (dataTypes == null && guessRows <= 0) throw new ArgumentException(\"Provide dataTypes or a positive guessRows\");","typeGuard":null,"tryCatchPattern":"try { return DataFrame.LoadCsv(stream, guessRows: guessRows); } catch (ArgumentException ex) when (ex.Message.Contains(\"guessRows\")) { return DataFrame.LoadCsv(stream, guessRows: 10); }","preventionTips":["Never pass guessRows <= 0 unless dataTypes is set","Keep LoadCsv defaults unless you intentionally supply dataTypes","Validate config-driven guessRows values at startup"],"tags":["argument","csv","validation"],"backgroundTag":"missing-required-argument","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"}