Чтение и загрузка csv файла на c#

Загрузка csv файла с выводом данных в dataGridView

Сегодня хочу показать на простом примере, как выполняется загрузка и чтение CSV файла с помощью языка c#. И так, для начала создадим Windows Forms приложение, после чего поместим на форму два элемента управления: кнопку и datagridview, в который будем выводить полученные данные.

Windows Forms Application

Затем создадим csv файл (cars.csv) и поместим в него 4 записи. Как Вы, наверное, знаете, формат csv подразумевает наличие некоторых правил формирования документа, так например: каждая строка заканчивается символами CLRF, а каждая запись, которая содержится в строке, запятыми.

csv файл

На этом подготовительная работа закончена и теперь переходим к решению основной задачи.

И так, чтобы прочитать и загрузить CSV файл нам понадобиться метод ReadAllLines, который позволяет построчно считать данные из файла.

string [] cars = File.ReadAllLines(@"C:\Cars.csv");

Чтение файла

Строки получены и теперь нам осталось выполнить всего две задачи:

1. Разбить каждую строку массива cars на отдельные значения. Для этого воспользуемся методом Split, в качестве параметра в который передадим знак-разделитель, которым в данном примере является запятая.

Split(',')

метод Split

2. Вывести полученные данные в окно datagridview. Для решения этой задачи создадим небольшую таблицу (DataTable), которая содержит пять колонок: фирма, название, год, максимальная скорость и цена, после чего заполним её ранее полученными одиночными значениями.

заполненный datagridview

Полный листинг

private DataTable ReadCSVFile(string pathToCsvFile)
{
//создаём таблицу
DataTable dt = new DataTable("Cars");
//создаём колонки
DataColumn colCompany;
colCompany = new DataColumn("Company", typeof(String));
DataColumn colName;
colName = new DataColumn("Name", typeof(String));
DataColumn colYear;
colYear = new DataColumn("Year", typeof(Int32));
DataColumn colMaxSpeed;
colMaxSpeed = new DataColumn("MaxSpeed", typeof(Int32));
DataColumn colPrice;
colPrice = new DataColumn("Price", typeof(Double));
//добавляем колонки в таблицу
dt.Columns.AddRange(new DataColumn [] {colCompany, colName,
colYear, colMaxSpeed,
colPrice});
try
{
DataRow dr = null;
string [] carValues = null;
string [] cars = File.ReadAllLines(pathToCsvFile);
for (int i = 0; i < cars.Length; i++)
{
if (!String.IsNullOrEmpty(cars[i]))
{
carValues = cars[i].Split(',');
//создаём новую строку
 dr = dt.NewRow();
dr["Company"] = carValues[0];
dr["Name"] = carValues[1];
dr["Year"] = int.Parse(carValues[2]);
dr["MaxSpeed"] = int.Parse(carValues[3]);
dr["Price"] = Double.Parse(carValues[4]);
//добавляем строку в таблицу
dt.Rows.Add(dr);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return dt;
}

Загружаем CSV файл и выводим данные в dataGridView.

private void button1_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = ReadCSVFile(@"c:\Cars.csv");
}

На этом всё, если есть какие-то вопросы, то оставляйте их в комментариях.

Читайте также:

13 комментариев

  1. Сергей says:

    Большое спасибо за информацию. Программировал на других языках, но встал вопрос свою старую программму переписать под c#, чтобы уйти от поддержки старых решений. И ключевая особенность работы в программе &#8212; чтение и управление csv файлами. Ваша информация была как нельзя кстати.

  2. Сергей says:

    Но в итоге возникает ошибка: Index was outside the bounds of the array. Причины не пойму.

  3. Обращение по индексу к элементу массива, которого нет.
    Например, в моем примере:

    dr[&#171;Price&#187;] = Double.Parse(carValues[4]);

    если вместо 4 поставить число 5, то возникнет исключение: &#171;Index was outside the bounds of the array&#187;. Потому что индекс последнего элемента массива carValues (а именно по индексу происходит обращение) будет равен 4, хотя элементов в массиве 5.

    arraySize = 5;
    firstIndex = 0;
    lastIndex = Array.Length &#8212; 1 //4;

    Это хорошо видно на картинке, после применения метода Split.

  4. Егор says:

    Большое спасибо за материал. Всё работает за исключением одного НО. Если в csv файле значения написаны на русском языке, то они некорректно отображаются в программе. Помогите пожалуйста с решением данной проблемы.
    Надеюсь на Вашу помощь. Спасибо.

  5. Если проблема возникает с кодировкой во время чтения файла (File.ReadAllLines), то тогда в данный метод можно добавить второй параметр, например:

    File.ReadAllLines(@"C:Cars.csv", Encoding.Default);
  6. Егор says:

    Благодарю за помощь и столь оперативный ответ! Решение помогло!

  7. Андрей says:

    Здравствуйте!

    Большое спасибо за пример!
    Не могли бы Вы выложить весь код aspx-файла?
    Я совсем не знаю ASP. Мне просто нужно 1 раз прочитать данные в таблицу из csv-файла

    С уважением, Андрей

  8. Андрей says:

    Здравствуйте!

    Я не пойму куда вставлять строки

    private void button1_Click(object sender, EventArgs e)
    {
    dataGridView1.DataSource = ReadCSVFile(@"c:Cars.csv");
    }

    Т.е. в какой месте asp файла их вставить

    С уважением, Андрей

  9. Андрей says:

    Спасибо!

    Теперь пишет ошибку компилятора
    &#187;
    Сообщение об ошибке компилятора: CS0246: The type or namespace name &#8216;DataTable&#8217; could not be found (are you missing a using directive or an assembly reference?)
    &#171;

  10. using System.Data; //добавить
  11. Владимир says:

    Все оказывается проще, а я вчера велосипед изобретал и отлаживал часа три.
    P.S. давно не прогал. решил восстанавливать скилл перейдя с С++ на С#

  12. NaGaRa says:

    Большое спасибо!

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*