Парсинг 1С файла в объект

Дан txt 1С файл, в котором заданы стандартные ключи и значения. Как пример:

Кодировка=Windows
Плательщик=Берёзка
...

Читаю построчно файл с помощью StreamReader

using var reader = new StreamReader(@"C:\Users\out_belousovd\Desktop\Test4445.txt");
string line = string.Empty;

while ((line = reader.ReadLine()) != null)
{
    //....
}   

Есть класс:

public class Parsing1CFile
{
   public string Encoding {get;set;}
   public string Payer {get;set;}
   //...
}

Вопрос в том, как оптимально смаппить читаемые строки в объект класса типа Parsing1CFile.

Писать при чтении каждой строчки кучу if-ов не хотелось бы.

Думал об использовании словаря, где первым значением будет ключ - "Кодировка=", а вторым значение - пустая строка. Читаемую строку можно разбирать на то, что до знака = (ключ) и после (значение). По ключу из строки искать в словаре и записывать значение в него.

Но дальше как полученный словарь спарсить в объект - затрудняюсь понять.


Ответы (1 шт):

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

Нужно спарсить файл в словарь, а потом инициализировать свойства:

public class Parsing1CFile {
    public string Encoding;
    public string Payer;
    //...
    public Parsing1CFile(string filename) {
        var lines = File.ReadAllLines(filename);
        var pars = lines
            .Select(s => s.Split('='))
            .ToDictionary(t => t[0], t => t[1]);
        pars.TryGetValue("Кодировка", out Encoding);
        pars.TryGetValue("Плательщик", out Payer);
        //...
    }
}

При желании можно использовать промежуточный JSON:

using System;
using System.IO;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace ConsoleApp4;

public class Parsing1CFile {
    [JsonPropertyName("Кодировка")]
    public string Encoding { get; set; }
    [JsonPropertyName("Плательщик")]
    public string Payer { get; set; }
    public static Parsing1CFile FromFile(string filename) =>
        JsonSerializer.Deserialize<Parsing1CFile>("{ " +
            string.Join(", ", File.ReadAllLines(filename)
                .Select(s => s.Split('='))
                .Select(s => "\"" + s[0] + "\":\"" + s[1] + "\"")) + " }");
}

internal class Program {
    static void Main(string[] args) {
        var settings = Parsing1CFile.FromFile("sample.txt");
        Console.WriteLine($"{settings.Encoding} {settings.Payer}");
    }
}

-->

Windows Берёзка
→ Ссылка