2010-09-19 66 views
2

我有我正在使用的以下stringBuilder作爲Log4net日誌佈局的一部分。如何使用C#正確對齊選項卡式CSV數據文本文件?

var sb = new StringBuilder(DateTime.Now.ToString(DateFormatString, CultureInfo.InvariantCulture)); 
      sb.Append("\t"); 
      sb.Append(log.EventAction); 
      sb.Append("\t"); 
      sb.Append(log.Id); 
      sb.Append("\t"); 
      sb.Append(log.MessageId); 
      sb.Append("\t"); 
      sb.Append(log.CodeBlock); 
      sb.Append("\t"); 
      sb.Append(log.Details); 

我預計\ T(標籤)給我一個準確的黏合作爲deliminator,這樣當視覺檢查文本文件,列將對齊。然而,這種情況並非如此!

列沒有對齊,當我打開MS Word和「顯示特殊字符」中的文本文件時,我看到相同的標籤條目似乎存在,但在記事本中直觀地看,列不對齊。

我真的很困惑,也許我需要審查標籤的定義,任何人都可以提供對此問題的見解或解決方法?

更新:

我已經注意到,如果我有相同長度的字符串,則列對齊,因此,例如:

string1(len5) TAB string2(len5) TAB string3(len5) 
string1(len5) TAB string2(len5) TAB string3(len5) 
string1(len5) TAB string2(len5) TAB string3(len5) 

然而,如果串的長度不同,標籤char是本,但字符串不對齊:

string1(len5) TAB string2(len5) TAB string3(len5) 
string1(len10) TAB  string2(len5) TAB string3(len5) 
string1(len5) TAB string2(len5) TAB string3(len5) 
string1(len10) TAB  string2(len5) TAB string3(len5) 

事情是這樣的......

+0

你是什麼意思「標籤的2個版本」,究竟是什麼? – 2010-09-19 09:00:11

+0

嗨,馬克,我更新了這個問題。 – 2010-09-19 09:02:38

回答

2

選項卡只是一個邏輯分隔符。它沒有什麼神奇的能力來對齊數據,這取決於你的瀏覽器如何解釋標籤;它可能意味着「縮進4個字符」,這可能意味着「填充四捨五入到最接近的第8個字符」。因此,它通常非常依賴於現有的數據長度。在Word中,它通常被解釋爲「移動到下一個預定義的標籤」,但這取決於:在Word中定義了哪些標籤,以及b:數據已經有多寬(即什麼是「下一個」)。

在Excel(或任何電子表格)中,它通常會被解釋爲列。出於這個原因,電子表格可能是瀏覽表格分隔數據的最佳選擇(如果您關心的是列)。

所以;你在用什麼瀏覽器?

+0

Notepad.exe - 經常在服務器上查看。 – 2010-09-19 09:06:15

+0

@JL,那麼這根本就不起作用。如果你需要數據對齊,你可能需要填充空格,但爲了可行,你需要首先知道每個字段的最大長度。 – 2010-09-19 09:07:47

+0

填充ftw ...否則一個體面的標籤式記錄查看器。謝謝Marc! – 2010-09-19 09:10:27