CsvHelper.CsvReader не читает CSV-файлC#

Место общения программистов C#
Ответить
Anonymous
 CsvHelper.CsvReader не читает CSV-файл

Сообщение Anonymous »

Во-первых, моя программа должна добавлять содержимое CSV-файла в таблицу SQL в SQL Server, используя путь, помещенный в текстовое поле «pathInputTextBox», и имя таблицы из текстовое поле «tableInputTextBox» при нажатии кнопки «toSqlButton». После того, как я закончу эту часть, я также сделаю это для разных типов баз данных с использованием разных кнопок, но на данный момент он уже не может прочитать файл csv. (Я даже не знаю, сможет ли он вообще правильно добавить данные после этого, но я глупый парень, который сначала пишет весь код, а затем решает одну проблему за другой, поэтому я перейду этот мост, когда доберусь до цели. )

Ошибка:

Код: Выделить всё

CsvHelper.ReaderException: 'No header record was found.
IReader state:
ColumnCount: 0
CurrentIndex: -1
HeaderRecord:
с линии

Код: Выделить всё

csv.ReadHeader();
в событии toSQLButton_Click. В ходе отладки я обнаружил, что это связано с тем, что метод ReadCSV возвращает значение null, как и должно быть при сбое чтения файла.

Среди некоторых проблем, которые я пытался исправить, были написания различных способов прочитайте файл (например, TextReader), который по-прежнему будет работать с аналогичным синтаксисом и записью

Код: Выделить всё

CsvReader csv = new CsvReader(reader, new CsvConfiguration(CultureInfo.InvariantCulture) {Delimiter = ";", HasHeaderRecord = true });
вместо

Код: Выделить всё

CsvReader csv = new CsvReader(reader, CultureInfo.InvariantCulture);
но, похоже, ничего из этого не работает. Я на 100% уверен, что путь к файлу, который я записываю в текстовое поле, должен работать (да, я удалил "s" после копирования его в проводнике). Я порылся в Интернете и попросил помощи в ChatGPT, но я на своем месте. Сообразительность заканчивается, и такое ощущение, что это, должно быть, какая-то очень маленькая, глупая ошибка новичка, заложенная где-то в коде, которая должна быть очевидна. Пожалуйста, помогите мне, я с нетерпением жду ваших ответов.
код:

Код: Выделить всё

private CsvReader ReadCSV(string pathString)
{
try
{
var reader = new StreamReader(pathString);
CsvReader csv = new CsvReader(reader, new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = ";", HasHeaderRecord = true });
return csv;
}
catch (FileNotFoundException)
{
MessageBox.Show("File not found.  Please check the entered file path.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception ex)
{
MessageBox.Show("An error occurred while reading the CSV file: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return null;
}

private void toSqlButton_Click(object sender, EventArgs e)
{
string sqlConnection = "Data Source=VERYCOOLDATASOURCE\\SQLEXPRESS;Initial Catalog=VeryCoolDB;Integrated Security=True";
CsvReader csv = ReadCSV(pathInputTextBox.Text);
using(SqlConnection sqlconn = new SqlConnection(sqlConnection))
{
// Get CSV column names for comparison
csv.ReadHeader();
List csvColumns = csv.HeaderRecord.ToList() ?? new List();

// Get SQL column names for comparison
List sqlColumns = GetSQLColumns(sqlConnection, $"SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{tableInputTextBox.Text}'");

// Compare columns
if (csvColumns.All(sqlColumns.Contains) && csvColumns.Count == sqlColumns.Count)
{
try
{
sqlconn.Open();
using (SqlTransaction sqltrans = sqlconn.BeginTransaction())
using (SqlBulkCopy sqlcopy = new SqlBulkCopy(sqlconn, SqlBulkCopyOptions.KeepIdentity, sqltrans))
{
sqlcopy.DestinationTableName = tableInputTextBox.Text;
CsvDataReader csvdata = new CsvDataReader(csv);
sqlcopy.WriteToServer(csvdata);
sqltrans.Commit();
}
sqlconn.Close();
}
catch (Exception ex)
{
MessageBox.Show("An error occurred while writing the data: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
MessageBox.Show("Columns of the CSV file and columns of the SQL table do not match.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}

static List GetSQLColumns(string connectionString, string query)
{
List columns = new List();
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(query, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();

while (reader.Read())
{
columns.Add(reader["COLUMN_NAME"].ToString());
}

reader.Close();
connection.Close();
}
return columns;
}
Содержимое файла CSV:

Код: Выделить всё

mitid; vname; nname; gehalt; geburtsdatum
5; bingus; bongus; 1223.23; 2010-01-01;
6; bongus; bingus; 1223.23; 2010-01-01;
Используя путь к файлу:

C:\Users\MALA\Desktop\AppendExcelTest.csv

Подробнее здесь: https://stackoverflow.com/questions/784 ... d-csv-file
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»