Привести массив .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 шт):

Автор решения: aepot

Устанавливаем 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"

→ Ссылка