Привести массив .txt файлов в годный для импорта состояние
Поставлена такая задача, надо объединить .txt файлы таким образом, чтобы их можно было без труда импортировать в базу данных MS SQL Server. Я знаю как объединять содержимое нескольких файлов в один фрагмент, но не могу понять, как это сделать так, чтобы данные были распределены по столбцам, чтобы их можно было импортировать. Вот пример, как выглядит один из 76 файлов:
Id: 1
Name: Мурзич Дорофея Никодимовна
Home address: 394071 Россия, Воронеж, ул. Челюскинцев 58, кв. 31
Phone number: +7 (910) 611-79-31
Date of Birth: 13.01.1987
Email: [email protected]
Password: mg*7k+4rgn-YhlLGMFhO
Nikname: Makikoob
Все 76 файлов надо объединить таким образом, чтобы они имели такой вид:
ID;FirstName;LastName;Patronymic;HomeAddress;PhoneNumber;DateOfBirth;Email;Password;Nikname;
1;Мурзич;Дорофея;Никодимовна;394071 Россия, Вроноже, ул. Челюскинцев 58, кв. 31; +7 (910) 611-79-31;13.01.1987;[email protected];mg*7k+4rgn-YhlLGMFhO;Mikaoob;
Таких блокнот файлов, как уже сказал, около 100, надо сделать так, чтобы столбцы шли как показано на рисунке 2 - первой строкой, а дальше уже шли только данные разделенные точкой запятой.
Ответы (1 шт):
Устанавливаем NuGet пакет CsvHelper и добавляем директивы
using CsvHelper;
using CsvHelper.Configuration;
using CsvHelper.Configuration.Attributes;
Берем вот такую упрощенную модель данных
public class DataItem
{
public string Id { get; set; }
public string Name { get; set; }
[Name("Home address")] // аттрибуты можете убрать, если вам нужно имя свойства, а не точно так, как в исходных файлах
public string HomeAddress { get; set; }
[Name("Phone number")]
public string PhoneNumber { get; set; }
[Name("Date of Birth")]
public string DateOfBirth { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string Nikname { get; set; }
}
Берем файлы с исходными данными и кладем в папку \files относительно исполняемого файла (например внутри bin\Debug).
Тогда вот такой код
class Program
{
static void Main(string[] args)
{
List<DataItem> list = new List<DataItem>();
foreach (string path in Directory.GetFiles("files", "*.txt"))
{
string[] values = File.ReadAllLines(path).Select(x => x.Split(':', 2)[1].Trim()).ToArray();
list.Add(new DataItem
{
Id = values[0],
Name = values[1],
HomeAddress = values[2],
PhoneNumber = values[3],
DateOfBirth = values[4],
Email = values[5],
Password = values[6],
Nikname = values[7]
});
}
CsvConfiguration config = new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = ";" };
using (CsvWriter writer = new CsvWriter(new StreamWriter("users.csv"), config))
{
writer.WriteHeader(typeof(DataItem));
writer.NextRecord();
list.ForEach(x =>
{
writer.WriteRecord(x);
writer.NextRecord();
});
}
}
}
Выдаст ровно тот результат в файле users.csv, который вам нужен.
P. S. у вас опечатка в слове "Nikname", должно быть "Nickname"