Экспорт содержимого списка объектов в текстовом файле в табличном порядке с использованием C#

У меня есть список объектов, и я хотел бы экспортировать его в текстовом файле. Мне бы хотелось, чтобы имя свойства было заголовком столбца.

Я сделал это

public static void Write(IList<ValidationResultAttribute> dt, string filePath)
        {
            int i = 0;
            StreamWriter sw = null;
            sw = new StreamWriter(filePath, false);

            PropertyInfo[] properties = typeof(ValidationResultAttribute).GetProperties();
            // write columns header
            foreach (PropertyInfo property in properties)
            {
                sw.Write(property.Name + "  ");
            }
            sw.WriteLine();


            // write value
            foreach (ValidationResultAttribute res in dt)
            {
                PropertyInfo[] prop = typeof(ValidationResultAttribute).GetProperties();

                foreach (PropertyInfo property in prop)
                {
                    sw.Write(property.GetValue(res, null) + "  ");
                }
                sw.WriteLine();
            }
            sw.Close();
        }
    }

но у меня есть этот вывод

PresentationName    SlideName   ShapeName   RunIndexs   Attribute   Rule        Fail    Pass  
pptTest.pptx        Slide1      Rectangle 3 FontSize    Value       22          1       0  
pptTest.pptx        Slide2      TextBox 3   FontSize    Between     20and 72    1       0  

Есть ли способ отформатировать выходной текстовый файл (значение под столбцом)?

2 ответа

Вы можете использовать string.format, чтобы получить желаемый результат. Работает также с sw.Write(format, args)

sw.Write("[{0,-20}|{1,10}]", "UnitPrice", 3.4457M);

напишет

[UnitPrice           |    3,4457]

Отрицательное значение за спецификатором формата означает выравнивание по левому краю, а значение позитива означает выравнивание по правому краю.

Есть одна ловушка, эти методы не будут усекать ваши данные, поэтому

    sw.Write("[{0,-20}|{1,10}]", "ThisStringIsLongerThanExpected", 3.4457M);

приведет к

[ThisStringIsLongerThanExpected|    3,4457]

Так что выбирайте значения достаточно большие или обрезайте свои строки, чтобы соответствовать.

В вашем случае вы можете рассчитать длину, исходя из того, какое длиннее имя свойства или его значение.

        var values = new List<KeyValuePair<string, object>();
        PropertyInfo[] properties = typeof(ValidationResultAttribute).GetProperties();

        foreach (PropertyInfo property in properties)
        {
            values.Add(property.Name, property.GetValue(res, null);
        }

        foreach(var value in values)
        {
            var length = Math.Max(value.Key.Length, value.Value.ToString().Length);
            var format = "{0,-" + length.ToString() + "} ";
            sw.Write(format, value.Key);
        }
        sw.WriteLine();

        foreach(var value in values)
        {
            var length = Math.Max(value.Key.Length, value.Value.ToString().Length);
            var format = "{0,-" + length.ToString() + "} ";
            sw.Write(format, value.Value);
        }
        sw.WriteLine();

Выполните следующие изменения кода, чтобы создать файл с разделителями табуляции. Этот файл легко разбирать и легко читать.

  1. sw.Write(property.Name + " "); изменить это на sw.Write(property.Name + "\t");

  2. sw.Write(property.GetValue(res, null) + " "); изменить это на sw.Write(property.GetValue(res, null) + "\t");

Другие вопросы по тегам