0

オブジェクト リストがあり、それをテキスト ファイルにエクスポートしたいと考えています。プロパティ名が列ヘッダーであることを望みます。

私はこれをやった

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  

出力 txt ファイル (列の下の値) をフォーマットする方法はありますか?

4

2 に答える 2

1

string.format を使用して、目的の結果を得ることができます。も動作しますsw.Write(format, args)

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

書こう

[UnitPrice           |    3,4457]

フォーマット指定子の後ろの負の値は左揃えを意味し、正の値は右揃えを意味します。

落とし穴が 1 つあります。この方法ではデータが切り捨てられないため、

    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();
于 2015-05-27T10:55:42.577 に答える