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()以处理这样一种情况,即您会发现自己在遍历客户对象的列表或数组。最好分别编写每个客户对象,而不是传递一个大字符串
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)
);
}
}