На чемпионате часто возникает ситуация, когда нужно загрузить данные в базу программно, поэтому нужно уметь делать это быстро и просто. Подробнее мы остановимся на этом в курсе "Проектирование и разработка ИС", но тренироваться использовать загрузку данных из CSV будем на лабораторных работах и в этом курсе.
Файл с данными нужно положить в каталог bin/Debug/net9.0 вашего проекта (но так как у нас используется .gitignore, то в этом случае для файла CSV нужно настроить исключение), либо туда, где расположен проект (а в этом случае в программе нужно указать относительный путь к файлу CSV: ../../../ваш файл.csv)
Акесов,18
Андреев,19
В коде ниже я не использую никаких библиотек для работы с CSV, вы можете использовать библиотеку CSVHelper, которую мы рассматривали на соответствующей лекции.
class Peoples {
string Name;
int Age;
}
...
var Peoples = new List<People>();
// считываем данные из файла (файл лежит рядышком с .exe)
string[] data = File.ReadAllLines("./ваш файл.csv");
// проходим в цикле по считанным строкам
foreach (var line in data)
{
// разделяем каждую строку на массив строк с указанием символа разделителя
var values = line.Split(',');
Peoples.Add( new People {
Name=values[0],
Age=Convert.ToInt32(values[1])
});
}
Дату в CSV желательно хранить в формате YYYY-MM-DD (SQL-формат). Такой формат нормально преобразуется в класс Data (DataTime) штатным конвертером. Иначе придется разбирать строку даты на составные части (функцией split) и создавать дату из этих частей (new Date(year, month, day))
В качестве разделителя дробной части в числах с плавающей запятой (float, double) в CSV обычно используется точка. Но конвертер использует настройки локальной среды, а для России в качестве разделителя задана запятая, поэтому конвертер не может разобрать строку с точкой и выбрасывает исключение. В этом случае можно либо заменить точки на запятые в CSV файле (но в таком случае и разделителем полей должен быть другой знак), либо в конвертер передать дополнительный параметр, явно указывающий разделитель для дробной части:
Convert.ToDouble("113.12", new NumberFormatInfo(){NumberDecimalSeparator="."});