C# 正在写入文件并格式化行。需要建议

C# 正在写入文件并格式化行。需要建议,c#,C#,不知道你是否有更好的建议,我已经想出了 我需要以特定格式编写文本文件 每个字段必须从指定的位置开始,并且必须用空格填充,直到下一个字段 例如: Field Position in the row Name 1 Surname 20 Address 50 Country 90 DOB

不知道你是否有更好的建议,我已经想出了

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

例如:

        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; }
                }
            }
建议:

  • “CreateHeader()”方法中未使用Customer对象-将其删除
  • 考虑重构WriteToFile()以处理这样一种情况,即您会发现自己在遍历客户对象的列表或数组。最好分别编写每个客户对象,而不是传递一个大字符串

看起来图书馆会很好地完成这个任务。我已经将它用于CSV文件,但它似乎也可以处理固定宽度的文件。

如果您知道每列的宽度,可以使用它来格式化行。例如:

string s = String.Format("{0,-19}{1,-29}", customer.Name, customer.Surname);
sb.AppendLine(string);
当然,你的台词会长一些。但是你可以在一个电话里完成这一切

负对齐值表示左对齐。正值可在字段中正确对齐

你也可以使用

有关使用这两种方法之一设置格式的详细信息,请参阅

这里唯一的缺点是,如果要在字段中放置的值比字段宽度长。正如文件所说:

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


我一直都这样做,下面是我的建议。。。。使用您的类并重写“ToString”函数,或者创建一个名为其他函数的自定义函数。使用“PadRight”字符串函数创建具有右填充的固定长度字段

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

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


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

这种问题可能更适合您,您可以使用FileHelper使许多代码变得琐碎。就像您的建议一样,我将覆盖字符串,但不确定如何在所需位置将字符串最好地连接在一起PadRight()使其成为固定宽度的字段,因此您只需输入每个字段的长度,下一个字段将从下一个位置开始。例如,Name=20个字符,姓氏=30,那么您就可以使用Name.PadRight(20),namespadright(30)。您好,不能使用第三方库hanks作为建议。只需找到一种方法,将字符串写入问题中描述的特定位置。是否可以suggestion@user231465我对扎卡里的回答投了赞成票。你可能会发现它符合你的需要。我想知道是否有一种方法可以只写如“20”和该字符串,并将其写在位置20。而不是我计算值。我有一个很长的列表,上面列出了每一列的位置。让我理解这个“{0,-19}{1,-29}”,将在“0-19”之间写入第一个字符串,第二个从30开始,以此类推。。问题是我必须计算批次。@user231465:值是字段的宽度,而不是起始位置。因此,在您的示例中,前两个实际上是
{0,-20}{1,-30}
。是的,您必须根据偏移计算字段宽度。这应该不难。
            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)
                        );
                }
            }