Tshumore Ответов: 1

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

1 Ответов

Рейтинг:
1

OriginalGriff

Посмотрите на свои данные: это не CSV.
Он содержит пару символов запятой, да - 30 из них, в нескольких сотнях строк данных - но это не CSV. Я понятия не имею, что это такое, но либо вы пытаетесь обработать неправильный файл, либо вам нужно выяснить, каким должен быть формат и решить, как это сделать.

Ни один CSV-парсер не даст вам хороших результатов из этих данных.


Tshumore

Я получаю ошибку всякий раз, когда открываю его в Excel, который говорит : формат файла и расширение " не совпадают. Файл может быть поврежден или небезопасен.

OriginalGriff

Потому что это не CSV-файл.
Это также не файл XLSX.

Я понятия не имею, что это такое: вам нужно вернуться туда, где вы его взяли, и выяснить!