2014-03-03 122 views
0

我一直試圖在c#中創建一個選項卡有限的文本文件,以便數據在不同的列中正確顯示。用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]); 
    } 
} 
+1

它看起來對我有什麼你會得到_is_製表符分隔。 –

+0

@DaveZych我該怎麼做才能得到列分隔的格式? – Vahid

回答

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是沒有必要的,因爲這是最後column.There無需任何附加的right.Anyway如果你有更多的屬性,那麼你需要使用太多。

+2

我喜歡這個答案。我剛剛在下面發佈了我的答案,但認爲您的解決方案比我計劃的更優雅(即,用空格填充字符串,循環)。使用.PadRight(...)是一個好主意。 – danyluis

1

你們看到的是由於標籤顯示在輸出中的方式。 它看起來對我來說是正確的製表符分隔,只是不同的長度導致製表符對齊到不同的製表位。

如果要在控制檯中查看,請嘗試使用空格填充以將每列填充到相同數量的字符。

查看答案this question小費,但要點是:

String.format("%10s", P[i,0]); 

等每個人的。

如果它實際上應該被理解爲數據,然後保留原樣,因爲它是正確的,現在(雖然你可能想要刪除的字符串中的空間(即"{0}\t{1}\t{2}"

+0

也許我在這裏使用了錯誤的術語。我如何獲得上面顯示的列分隔格式? – Vahid

+0

正如@danyluis在回答中所說的那樣,現在是如何(但是在字符串中刪除了空格)是要走的路。 如果它沒有顯示出你想要的樣子,試着找一個帶有可調節制表符的編輯器(比如Word如何操作,儘管我並不建議你使用它......) – Jeff

1

嗨:如果你絕對需要使用TAB字符(例如,如果你需要生成一個可以在Microsoft Excel中輕鬆讀取的文件作爲TAB分隔的文本文件),那麼你正確地做了這件事,因爲你'在每兩列之間只使用一個TA​​B。但是,如果你想要的是很好地顯示列間隔,那麼我建議使用空格而不是製表符。這很容易管理。例如,搜索所有字符串,找到最寬的字符串,例如,將該值加上5,然後使用該知識來佈置字符串(即根據需要添加儘可能多的空格以使所有列看起來對齊)。如果您需要代碼幫助,我可以稍後發佈。但請讓我知道。

+0

感謝您的回答,事實上我不需要以後再讀它,但是我想知道是否可以有一個漂亮的文件,並且能夠使用Streamreader讀取它。感謝您的澄清。 – Vahid

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 
+0

@D Stanley使用{,}中的填充值看起來很優雅,但上面的代碼不起作用。謝謝 – Vahid

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個字符和文本靠左對齊,第二colu相同的列mn,而第三列的寬度爲10個字符,數據(年齡)在右側對齊。

當然,爲了看到列的精確對齊,您需要使用固定寬度的字體來查看數據(例如Courier或Lucida控制檯),否則您將看到未對齊的列,但這是由於以下事實:可變寬度字體W需要在水平更多的像素比字母對應的字母i

+0

這是最好的答案。在項目之間結合'\ t',這將完成OP所需的一切。 – Jeff

-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]); 
    } 
}