Экспорт содержимого списка объектов в текстовом файле в табличном порядке с использованием 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();
Выполните следующие изменения кода, чтобы создать файл с разделителями табуляции. Этот файл легко разбирать и легко читать.
sw.Write(property.Name + " ");
изменить это наsw.Write(property.Name + "\t");
sw.Write(property.GetValue(res, null) + " ");
изменить это наsw.Write(property.GetValue(res, null) + "\t");