写入文件并格式化行.需要建议

本文关键字:格式化 文件 | 更新日期: 2023-09-27 18:10:41

不知道您是否有更好的建议。

我需要以特定格式编写一个文本文件每个字段必须从指定的位置开始,并且必须用空格填充,直到下一个。

的例子:

        Field            Position in the row
        Name             1  
        Surname          20
        Address          50
        Country          90
        DOB              120
        MaritalStatus    160

下面是我的原型尝试,是否有更整洁更好的方法来做到这一点?需要在单元测试中测试行中的位置是否正确?

有什么建议吗?

              class Program
                {
                    static void Main(string[] args)
                    {
                        Customer customer=new Customer();
                        customer.Name = "Jo";
                        customer.Surname = "Bloggs";
                        customer.Address = " 1 NewYork Road";
                        customer.Country = "UK";
                        customer.DOB = "29/04/1990";
                        customer.MaritalStatus = "Married";
                        StringBuilder sb=new StringBuilder();
                        CreateHeader(customer,sb);
                        sb.AppendLine("");
                        CreateRow(customer, sb);
                        sb.AppendLine("");
                        IOExtensions.WriteToFile(sb.ToString(), "TestFile.txt");
                    }
                    private static void CreateHeader(Customer customer,StringBuilder sb)
                    {
                        /*
                           * 
                          Field            Position in the row
                          Name             1    
                          Surname          20
                          Address          50
                          Country          90
                          DOB              120
                          MaritalStatus    160
                           */
                        //First Field
                        sb.Append(FormatValue("Name", 19));
                        sb.Append(FormatValue("Surname", 29));
                        sb.Append(FormatValue("Address", 39));
                        sb.Append(FormatValue("Country", 29));
                        sb.Append(FormatValue("DOB", 39));
                        //Last field does not matter
                        sb.Append(FormatValue("MaritalStatus", 9));

                    }
                    private static void CreateRow(Customer customer, StringBuilder sb)
                    {
                        /*
                           * 
                          Field            Position in the row
                          Name           1  
                          Surname          20
                          Address          50
                          Country          90
                          DOB              120
                          MaritalStatus    160
                           */
                        //First Field
                        sb.Append(FormatValue(customer.Name, 19));
                        sb.Append(FormatValue(customer.Surname, 29));
                        sb.Append(FormatValue(customer.Address, 39));
                        sb.Append(FormatValue(customer.Country, 29));
                        sb.Append(FormatValue(customer.DOB, 39));
                        //Last field does not matter
                        sb.Append(FormatValue(customer.MaritalStatus, 19));

                    }
                    private static string FormatValue(string value, int maxLength)
                    {
                        //TODO ADD OTHER STUFF HERE
                        return value.PadRight(maxLength, ' ');
                    }
                }
                public static class IOExtensions
                {
                    public static void WriteToFile(string text, string path)
                    {
                        using (var fs = File.CreateText(path))
                        {
                            fs.Write(text);
                        }
                    }
                }
                public class Customer
                {
                    public string Name { get; set; }
                    public string Surname { get; set; }
                    public string Address { get; set; }
                    public string Country { get; set; }
                    public string DOB { get; set; }
                    public string MaritalStatus { get; set; }
                }
            }

写入文件并格式化行.需要建议

我一直这样做,这是我的建议....使用您的类并覆盖"ToString"函数或创建一个名为其他东西的自定义函数。使用"PadRight"字符串函数创建固定长度的右填充字段。

示例(您需要将其余字段添加到ToString中):

            public class Customer
            {
                public string Name { get; set; }
                public string Surname { get; set; }
                public string Address { get; set; }
                public string Country { get; set; }
                public string DOB { get; set; }
                public string MaritalStatus { get; set; }
                public override string ToString()
                {
                    return String.Format("{0}{1}{2}",
                        Name.PadRight(20),
                        Surname.PadRight(30),
                        Address.PadRight(40)
                        );
                }
            }

注意:我们使用长度来控制每个字段的起始位置。如果第一个字段是20个字符,则下一个字段将从21开始,并达到您定义的长度。

现在,循环遍历数据并填充对象,并调用customer.ToString()以写出格式化的字符串。

如果您知道每个列的宽度,您可以使用String。Format格式化该行。例如:

string s = String.Format("{0,-19}{1,-29}", customer.Name, customer.Surname);
sb.AppendLine(string);

当然,你的台词会稍微长一些。但是您可以在一个调用中完成所有这些。

负对齐值表示左对齐。

你也可以使用StringBuilder.AppendFormat.

有关使用这两种方法进行格式化的更多信息,请参阅复合格式化。

唯一的缺点是如果您想要放置在字段中的值比字段宽度长。如文档所述:

如果align的值小于格式化字符串的长度,则忽略对齐,并使用格式化字符串的长度作为字段宽度。

建议:

  • 客户对象在"CreateHeader()"方法中未被使用-删除它
  • 考虑重构WriteToFile(),以处理在客户对象列表或数组中迭代的情况。最好单独编写每个Customer对象,而不是传递一个大字符串

看起来FileHelpers库可以很好地完成这个任务。我用它来处理CSV文件,但它似乎也可以处理固定宽度的文件。