使用单独的列在c#中创建分隔文本

时间:2014-03-03 22:38:01

标签: c# delimited-text

我一直在尝试在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]);
    }
}

6 个答案:

答案 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分隔的文本文件),那么你正确地做到了,因为你每两列只使用一个TA​​B。但是,如果你想要的是显示间隔很好的列,那么我建议使用空格而不是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]);
    }
}