【问题标题】:Format table to text output in C#在 C# 中将表格格式化为文本输出
【发布时间】:2018-09-25 14:53:44
【问题描述】:

我有一个查询与 C# 中的 SQL 数据库。从这个查询中,我得到一个类似的列表:

List<List<string>>()

如果需要,此列表可以更改为任何其他表格类型。

在 Microsoft Server Management Studio 中,它看起来像这样:

在 Microsoft SQL Server Management Studio 中,您可以简单地将结果输出为文本,如下所示:

现在我要自动化一些任务,我将使用 C# 而不是手动使用 MSSQL。由于 GXP 环境,重要的是要单独记录数据库中的每个数据更改,并在“票据”上附加文本报告。

目前我的表格文本生成查询如下所示:

SqlCommand command = new SqlCommand("SELECT '" + description + "' AS '" + description + "', CPPS_Site,Study_Id,CustNo,CPPS_Job FROM CDS.dbo.Studies " +
                                            "WHERE Study_Id = " + studyID, con);
List<string> overview = new List<string>();

overview.Add("|=========================================================|");
overview.Add("|"+description + "\t|CPPS_Site\t|Study_ID\t|CustNo\t|CPPS_Job|");
overview.Add("|---------------------------------------------------------|");
using (SqlDataReader resultQuery = command.ExecuteReader())
{
    var schemaTable = resultQuery.GetSchemaTable();
    while (resultQuery.Read())
    {
        string build = "|";
        build +=  resultQuery.GetSqlValue(0) + "\t|"
              + resultQuery.GetSqlValue(1) + "\t\t|"
              + resultQuery.GetSqlValue(2) + "\t\t|"
              + resultQuery.GetSqlValue(3) + "\t|"
              + resultQuery.GetSqlValue(4);
        build += "|";
        overview.Add(build);
     }
overview.Add("|=========================================================|");
     return overview;
 }

结果:

虽然这在技术上可行并且也会被接受,但我个人对这种丑陋的解决方案非常不满意。例如,对于不同长度的字符串,格式将不再适合。你知道更干净的解决方案吗?

【问题讨论】:

  • 这个 Nuget 包可能会做你想做的事:nuget.org/packages/DanielStout.AsciiTableFormatter
  • 我该如何使用它?我不熟悉 IEnumerable,我只找到一个手动使用的示例
  • 我认为您熟悉IEnumerable。你只是不知道...... :-)
  • 感谢这个建议......我仍然无法用我不知道的东西来构建一些东西
  • 您可以使用 5 个字段创建一个类,将每个 while 循环的此类实例添加到列表中(就像您为字符串所做的那样)。然后将列表交给 asciitableformatter 包。

标签: c# sql text output tabular


【解决方案1】:

Composite string formatting 提供了一个对齐组件,可用于指定字段大小并将值左对齐或右对齐。例如

String.Format("|{0,5}",5);

会产生

|    5|

每一行可以写成:

var linePattern="|{0,-7}|{1,-17}|{2,-11}|{3,-14}|{4,-8}|";
var line= String.Format(linePattern
    resultQuery.GetSqlValue(0),
    resultQuery.GetSqlValue(1),
    resultQuery.GetSqlValue(2),
    resultQuery.GetSqlValue(3),
    resultQuery.GetSqlValue(4));

标题可以使用相同的模式编写:

var header=String.Format(linePattern,"Before","CPPS_Site","Study_ID","CustNo","CPPS_Job");

将标题和行写入控制台将如下所示:

|Before |CPPS_Site        |Study_ID   |CustNo        |CPPS_Job|
|Before |1                |2          |C50030        |999     |

如果字符串大于字段值,则不会被截断,格式会出现错误,例如:

|Before |CPPS_Site        |Study_ID   |CustNo        |CPPS_Job|
|Before123 |1                |2          |C50030        |999     |

【讨论】:

  • 不幸的是,损坏的格式正是我遇到的问题。但看起来像我可以建立的东西
  • @julianbechtold 在这种情况下,您必须加载所有数据才能计算字段长度。也许您可以将所有内容加载到 DataTable 中,或者读取前 100 行并使用它们来计算字段长度
猜你喜欢
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 2021-04-15
相关资源
最近更新 更多