Парсинг 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 шт):
Нужно спарсить файл в словарь, а потом инициализировать свойства:
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 Берёзка