我一直在尝试在c#中创建一个标签限制文本文件,以便数据在不同的列中正确显示。
Firstname Lastname Age
John Smith 17
James Sawyer 31
我尝试了“\ t”字符,但我得到的只是:
Firstname Lastname Age
John Smith 17
James Sawyer 31
这是我的代码:
string[,] P = new string[2, 3] {
{ "John", "Smith", "17" },
{ "James", "Sawyer", "31" }
};
using (StreamWriter s_w = new StreamWriter(target))
{
s_w.WriteLine("Firstname \t Lastname \t Age");
for (int i = 0; i < 2; i++)
{
s_w.WriteLine("{0} \t {1} \t {2}", P[i,0], P[i,1], P[i,2]);
}
}
答案 0 :(得分:3)
使用string.Format和composite formatting precision功能允许您使用每列的确切字符数准备文本列
string[,] P = new string[2, 3] {
{ "John", "Smith", "17" },
{ "James", "Sawyer", "31" }
};
using (StreamWriter s_w = new StreamWriter(target))
{
string row = string.Format("{0,-30}{1,-30}{2,10}", "Firstname", "Lastname", "Age");
s_w.WriteLine(row);
for (int i = 0; i < 2; i++)
{
row = string.Format("{0,-30}{1,-30}{2,10}", P[i,0], P[i,1], P[i,2]);
s_w.WriteLine(row);
}
}
这将使您的数据在三列中对齐,第一列是30个字符宽,文本在左侧对齐,第二列是相同的,而第三列是10个字符宽,数据(年龄)是对齐的在右边。
当然要查看列的精确对齐方式,您需要使用固定宽度字体(例如Courier或Lucida Console)查看数据,否则您会看到不对齐的列,但这是因为可变宽度字体字母W
在水平方向上需要的字母数多于字母i
答案 1 :(得分:2)
您可以像这样使用PadRight
:
s_w.WriteLine("{0} \t {1} \t {2}",
P[i, 0].PadRight(10, ' '),
P[i, 1].PadRight(10, ' '),
P[i, 2].PadRight(10, ' '));
请注意,最后一个PadRight
不是必需的,因为它是最后一列。没有必要在右边添加任何内容。如果你有更多属性,那么你也需要使用它。
答案 2 :(得分:1)
您所看到的是由于选项卡在输出中的显示方式。 它看起来正确地以制表符分隔给我,只是不同的长度导致制表符对齐不同的制表位。
如果要在控制台中查看,请尝试使用空格填充以将每列填充到相同数量的字符。
请参阅this question的答案以获取提示,但要点是:
String.format("%10s", P[i,0]);
以及其他每个人。
如果它实际上应该被读作数据,那么保持原样,因为它现在是正确的(尽管你可能想要删除字符串中的空格(即"{0}\t{1}\t{2}"
。
答案 3 :(得分:1)
嗨:如果你绝对需要使用TAB字符(例如,如果你需要生成一个可以在Microsoft Excel中轻松读取的文件,作为TAB分隔的文本文件),那么你正确地做到了,因为你每两列只使用一个TAB。但是,如果你想要的是显示间隔很好的列,那么我建议使用空格而不是TAB字符。它更容易管理。搜索所有字符串,找到最宽的字符串,例如,将此值加上5,然后使用该知识布置字符串(即,根据需要添加尽可能多的空格以使所有列看起来对齐)。如果您需要有关代码的帮助,我可以稍后发布。但请告诉我。
答案 4 :(得分:1)
我认为您希望使用空格而不是标签填充数据,而总是排队:
s_w.WriteLine("Firstname Lastname Age");
for (int i = 0; i < 2; i++)
{
s_w.WriteLine("{0,-20} \t {1,-20} \t {2}", P[i,0], P[i,1], P[i,2]);
} ^-- the -20 tells the formatter to left-align and pad to 20 characters
答案 5 :(得分:-1)
Selman22的答案完全完成了这项工作,这是另一个更简洁的解决方案:
string[,] P = new string[2, 3] {
{ "John", "Smith", "17" },
{ "James", "Sawyer", "31" }
};
using (StreamWriter s_w = new StreamWriter(target))
{
s_w.WriteLine("{0,-15} {1,-15} {2,-15}","Firstname", "Lastname" ,"Age");
for (int i = 0; i < 2; i++)
{
s_w.WriteLine("{0,-15} {1,-15} {2,-15}", P[i, 0], P[i, 1], P[i, 2]);
}
}