【问题标题】:C# Output Log PaddingC# 输出日志填充
【发布时间】:2014-11-13 09:49:57
【问题描述】:

我正在编写一个日志解析器,并且想将输出数据排序为列,目前使用以下代码:

string OEMVersion = string.Format("{0,-20} {1}", "OEM Version", GetXMLData(doc, "OemMarkerVersion"));
string OEMID = string.Format("{0,-20} {1}", "OEM ID", GetXMLData(doc, "OemId"));
string OEMTableID = string.Format("{0,-20} {1}", "OEM TableID", GetXMLData(doc, "OemTableId"));
string Manufacturer = string.Format("{0,-20} {1}", "Manufacturer", GetXMLData(doc, "Manufacturer"));
string Model = string.Format("{0,-20} {1}", "Model", GetXMLData(doc, "Model"));

要对填充进行排序,但输出仅适用于某些字体(Consolas、Lucinda Console 等)。如何用制表符而不是空格填充列来克服这个问题? string.Format() 似乎不允许我这样做。谢谢。

【问题讨论】:

  • 具有比例宽度的字体不容易对齐。另外,如果您使用标签。
  • 即使使用选项卡,根据您的内容,您的输出也可能无法正确对齐。这意味着如果您的第二个“制造商”值比第一个多 4 或 8 个字符,那么标签会将第二个推出。
  • 我想知道这种对齐的原因。如果这些变量只是简单地写入文件,则无需担心。当前代码完美地对齐它们,这只是使用正确字体的问题。如果这些变量应该在视频中输出,那么我建议使用ListViewDataGridView 让数据按列和行对齐,而无需手动对齐它们
  • 谢谢大家的回复,我想我想要的解决方案不存在。 @Steve,它只是简单地写入了一个新的文本文件,我希望为所有字体提供一个漂亮整洁的输出,但从事情的声音来看这是无法完成的。

标签: c# text padding


【解决方案1】:

只需将制表符添加到您的格式中?

string OEMVersion = string.Format("{0,-20}\t{1}", "OEM Version", GetXMLData(doc, "OemMarkerVersion"));
string OEMID = string.Format("{0,-20}\t{1}", "OEM ID", GetXMLData(doc, "OemId"));
string OEMTableID = string.Format("{0,-20}\t{1}", "OEM TableID", GetXMLData(doc, "OemTableId"));
string Manufacturer = string.Format("{0,-20}\t{1}", "Manufacturer", GetXMLData(doc, "Manufacturer"));
string Model = string.Format("{0,-20}\t{1}", "Model", GetXMLData(doc, "Model"));

您可能希望保留空格填充以减少较短字符串不超过较长字符串的制表符后制表符的风险。使用比例字体不会 100% 准确,但应该更干净。

【讨论】:

  • 谢谢,我试试看结果如何。
【解决方案2】:

如果您想在使用可变宽度字体时正确对齐视频输出上的变量,那么您需要某种表格控件的帮助,例如 ListViewDataGridView
(我假设是一个 WinForm 应用程序,但其他技术的概念是相同的)。

最好使用控件,因为替代方法是测量每个字符串的长度(以像素为单位)并使用Graphics.DrawString 将字符串部分定位在确切的像素位置。

让我展示一个使用 ListView 的示例

// Create a new ListView control. (or use the designer)
ListView listView1 = new ListView();
// Position and size of the ListView
listView1.Bounds = new Rectangle(new Point(10,10), new Size(500,200));
// Some display feature....
listView1.View = View.Details;
listView1.FullRowSelect = true;
listView1.GridLines = false;

// Add OEM Version value
ListViewItem item = new ListViewItem("OEM Version");
item.SubItems.Add(GetXMLData(doc, "OemMarkerVersion"));
listView1.Items.Add(item);

// Add OEM ID value
item = new ListViewItem("OEM ID");
item.SubItems.Add( GetXMLData(doc, "OemId"));
listView1.Items.Add(item);

... and so on for the others values and labels ....

// Some header formatting
listView1.Columns.Add("Label", 100, HorizontalAlignment.Left);
listView1.Columns.Add("Data", 400, HorizontalAlignment.Left);

// Put the ListView on video....
yourForm.Controls.Add(listView1);

【讨论】:

  • 输出必须是文本文件,因此使用控件将不起作用(它也是一个控制台应用程序 - 我很抱歉错过了这个细节),但感谢您的代码,它非常有趣!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多