System.indexoutofrangeexception: "не удается найти столбец 1"
У меня есть программа для анализа CSV-файла из локальной файловой системы в указанную таблицу SQL Server.
Теперь когда я выполняю программу я получаю ошибку
System.IndexOutOfRangeException: 'Cannot find column 1'исключение в строке, где i progrsm пытается заполнить datatable.
При ближайшем рассмотрении ошибка показывает, что она исходит из строки № 3, как показано ниже :
https://drive.google.com/file/d/1FOUavsf_D_1H5M2MGf6_v8kFDCNs_kYG/view?usp=sharing
Программа :
<pre> static void Main(string[] args) { var absPath = @"C:\Users\user\Documents\Projects\MastercardSurveillance\fbc_mc_all_cards.csv"; ProcessFile(); void ProcessFile() { string realPath = @"C:\Users\user\Documents\CSV"; string appLog = "CSVERRORS"; var logPath = realPath + Convert.ToString(appLog) + DateTime.Today.ToString("dd -MM-yy") + ".txt"; if (!File.Exists(logPath)) { File.Create(logPath).Dispose(); } var dt = GetDATATable(); if (dt == null) { return; } if (dt.Rows.Count == 0) { using (StreamWriter sw = File.AppendText(logPath)) { sw.WriteLine("No rows imported after reading file " + absPath); sw.Flush(); sw.Close(); } return; } ClearData(); InsertDATA(); } DataTable GetDATATable() { var FilePath = absPath; string TableName = "Cards"; string realPath = @"C:\Users\user\Documents\CSV"; string appLog = "CSVERRORS"; var logPath = realPath + Convert.ToString(appLog) + DateTime.Today.ToString("dd -MM-yy") + ".txt"; if (!File.Exists(logPath)) { File.Create(logPath).Dispose(); } var dt = new DataTable(TableName); using (var csvReader = new TextFieldParser(FilePath)) { csvReader.SetDelimiters(new string[] { "," }); csvReader.HasFieldsEnclosedInQuotes = true; var readFields = csvReader.ReadFields(); if (readFields == null) { using (StreamWriter sw = File.AppendText(logPath)) { sw.WriteLine("Could not read header fields for file " + FilePath); sw.Flush(); sw.Close(); } return null; } foreach (var dataColumn in readFields.Select(column => new DataColumn(column, typeof(string)) { AllowDBNull = true, DefaultValue = string.Empty })) { dt.Columns.Add(dataColumn); } while (!csvReader.EndOfData) { var data = csvReader.ReadFields(); if (data == null) { using (StreamWriter sw = File.AppendText(logPath)) { sw.WriteLine(string.Format("Could not read fields on line {0} for file {1}", csvReader.LineNumber, FilePath)); sw.Flush(); sw.Close(); } continue; } var dr = dt.NewRow(); for (var i = 0; i < data.Length; i++) { if (!string.IsNullOrEmpty(data[i])) { dr[i] = data[i]; } } dt.Rows.Add(dr); } } return dt; } void ClearData() { string SqlSvrConn = @"Server=XXXXXX-5QFK4BL\MSDEVOPS;Database=McardSurveillance;Trusted_Connection=True;MultipleActiveResultSets=true;"; using (var sqlConnection = new SqlConnection(SqlSvrConn)) { sqlConnection.Open(); // Truncate the live table using (var sqlCommand = new SqlCommand(_truncateLiveTableCommandText, sqlConnection)) { sqlCommand.ExecuteNonQuery(); } } } void InsertDATA() { string SqlSvrConn = @"Server=XXXXXX-5QFK4BL\MSDEVOPS;Database=McardSurveillance;Trusted_Connection=True;MultipleActiveResultSets=true;"; DataTable table = GetDATATable(); using (var sqlBulkCopy = new SqlBulkCopy(SqlSvrConn)) { sqlBulkCopy.DestinationTableName = "dbo.Cards"; for (var count = 0; count < table.Columns.Count; count++) { sqlBulkCopy.ColumnMappings.Add(count, count); } sqlBulkCopy.WriteToServer(table); } } }
Как я могу идентифицировать и, возможно, исключить дополнительные столбцы данных, возвращаемые из CSV-файла?
Что я уже пробовал:
Похоже, что существует несоответствие между количеством столбцов в datatable и количеством столбцов, считываемых из CSV-файла.
Однако я не уверен, как я могу объяснить это своей логикой. На данный момент я не хотел переключаться на использование пакета синтаксического анализа CSV, но мне нужно понять, как я могу удалить лишний столбец или, скорее, убедиться, что разделение учитывает все возможный сомнительные персонажи.
Для ясности у меня есть копия CSV файла здесь :
https://drive.google.com/file/d/1bPFf8aGAkM1UAOhfCq6hUV_rexd7GfpP/view?usp=sharing