C# 在控制台整齐的输出 DataTable

这篇具有很好参考价值的文章主要介绍了C# 在控制台整齐的输出 DataTable。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

效果:

C# 在控制台整齐的输出 DataTable,C# 核心技术与网络编程,c#

C# 在控制台整齐的输出 DataTable,C# 核心技术与网络编程,c#

一、前言

在 Winform 平台,可以用 DataGridView 这样的控件来显示数据库的表单数据,但在 C# 控制台项目中,如果有用到数据库查询,我们想看看查询语句的效果,就比较困难了,比如,我随意写了一个控制台输出,代码如下:

using System.Data;

namespace CSharpConnectMySQL
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string sql = "SELECT * FROM goods_type";
            DataSet dataSet = MySqlHelper.GetDataSet(sql);
            DataTable dt = dataSet.Tables[0];
            if(dt.Rows.Count > 0)
            {
                //打印所有列名
                string columnName = string.Empty;
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    columnName += dt.Columns[i].ColumnName + " | ";
                }
                Console.WriteLine(columnName);
                Console.WriteLine("-------------------------");

                //打印每一行的数据
                foreach (DataRow row in dt.Rows)
                {
                    string columnStr = string.Empty;
                    foreach (DataColumn column in dt.Columns)
                    {
                        columnStr += row[column] + " | ";
                    }
                    Console.WriteLine(columnStr);
                }
            }

            Console.ReadKey();
        }
    }
}

效果:

C# 在控制台整齐的输出 DataTable,C# 核心技术与网络编程,c#

在 Navicat 16 for MySQL 软件中的查询结果

C# 在控制台整齐的输出 DataTable,C# 核心技术与网络编程,c#

由于没有自动对齐的功能,打印出来的特别难看,于是我就想,能否自己写一个控制台打印数据库的方法出来,并且能自动对齐,虽然作用不大,起码看的舒服,那么接下来就来实现这个功能吧。

二、实现效果

由于后面的效果有用到数据库,所以没安装的 mysql 的,可以安装一下,并加入一些数据,或者手动写一个 DataTable 实体,并加入一些数据,都是可以的。

新建一个 C# 控制台项目,按我之前的帖子来加入一些连接数据库需要的类,和必要的插件

C# 连接 MySQL 数据库_c# mysql_熊思宇的博客-CSDN博客

添加一个类  ConsoleTool

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;

public class ConsoleTool
{
    /// <summary>
    /// 在控制台打印 DataTable
    /// </summary>
    /// <param name="dt"></param>
    public static void PrintDataTabele(DataTable dt)
    {
        if (dt == null)
        {
            Console.WriteLine("DataTable 不能为空");
            return;
        }

        //获取每一列的最大长度
        float[] lenList = GetColumnsMaxFontLength(dt);
        if (IsExceedMaxValue(lenList))
        {
            Console.WriteLine("DataTable列的总长度太长,控制台无法完整显示");
            return;
        }

        //字符串末尾添加多少个空格
        int endAddEmptyCount = 2;
        //打印标题
        string columnName = string.Empty;

        for (int i = 0; i < dt.Columns.Count; i++)
        {
            string value = dt.Columns[i].ColumnName;
            float emptyCount = lenList[i] - GetFontLenght(value);
            value = AppendEmpty(value, emptyCount + endAddEmptyCount);
            columnName += value;
        }
        string hengang = GetPrintBar(GetFontLenght(columnName));
        Console.WriteLine(hengang);
        Console.WriteLine(columnName);
        Console.WriteLine(hengang);

        //打印内容
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            string columnStr = string.Empty;
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                string? value = dt.Rows[i][j].ToString();
                if (string.IsNullOrEmpty(value)) value = "null";
                float emptyCount = lenList[j] - GetFontLenght(value);
                value = AppendEmpty(value, emptyCount + endAddEmptyCount);
                columnStr += value;
            }
            Console.WriteLine(columnStr);
        }

        Console.WriteLine(hengang);
    }

    /// <summary>
    /// 是否超过了规定的最大值
    /// </summary>
    /// <param name="lenList"></param>
    /// <returns></returns>
    private static bool IsExceedMaxValue(float[] lenList)
    {
        int singleMax = 100;
        int totalLength = 90;
        float value = 0;
        for (int i = 0; i < lenList.Length; i++)
        {
            value += lenList[i];
        }
        if (value > totalLength)
        {
            return true;
        }
        for (int i = 0; i < lenList.Length; i++)
        {
            if (lenList[i] > singleMax)
            {
                return true;
            }
        }
        return false;
    }

    /// <summary>
    /// 获取列中字符串最大的长度
    /// </summary>
    /// <param name="dataTable"></param>
    /// <returns></returns>
    private static float[] GetColumnsMaxFontLength(DataTable dataTable)
    {
        if (dataTable.Columns.Count == 0) return new float[0];
        if (dataTable.Rows.Count == 0) return new float[0];

        float[] columnLength = new float[dataTable.Columns.Count];

        //先加标题
        for (int i = 0; i < dataTable.Columns.Count; i++)
        {
            columnLength[i] = GetFontLenght(dataTable.Columns[i].ColumnName);
        }

        //再加具体列
        for (int i = 0; i < dataTable.Rows.Count; i++)
        {
            for (int j = 0; j < dataTable.Columns.Count; j++)
            {
                string? columnsCon = dataTable.Rows[i][j].ToString();
                if (string.IsNullOrEmpty(columnsCon)) columnsCon = "null";
                float columnsConLen = GetFontLenght(columnsCon);
                if (columnsConLen > columnLength[j])
                {
                    columnLength[j] = columnsConLen;
                }
            }
        }

        return columnLength;
    }

    /// <summary>
    /// 获取字体的长度
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    private static float GetFontLenght(string? value)
    {
        float nCount = 0;
        for (int i = 0; i < value?.Length; i++)
        {
            char val = value[i];
            //if (val >= 0x4e00 && val <= 0x9fbb)//汉字
            //    nCount += 1;
            if (IsChinese(val))
                nCount += 1;
            else
                nCount += 0.5f;
        }

        return nCount;
    }

    /// <summary>
    /// 给字符串添加空格
    /// </summary>
    /// <param name="value"></param>
    /// <param name="count"></param>
    /// <returns></returns>
    private static string AppendEmpty(string? value, float count)
    {
        if (string.IsNullOrEmpty(value))
            return string.Empty;
        if (count == 0)
            return value + " ";

        string[] arr = count.ToString().Split('.');
        int integer = 0;
        int decimals = 0;
        if (arr.Length == 1)
        {
            if (!int.TryParse(arr[0], out integer))
                return string.Empty;
        }
        if (arr.Length == 2)
        {
            if (!int.TryParse(arr[0], out integer))
                return string.Empty;
            if (!int.TryParse(arr[1], out decimals))
                return string.Empty;
        }
        for (int i = 0; i < integer; i++)
        {
            value += "  ";
        }
        if (decimals == 5)
        {
            value += " ";
        }
        return value;
    }

    /// <summary>
    /// 获取横杆
    /// </summary>
    /// <param name="count"></param>
    /// <returns></returns>
    private static string GetPrintBar(float count)
    {
        string bar = string.Empty;
        string[] arr = count.ToString().Split('.');
        int integer = 0;
        int decimals = 0;
        if (arr.Length == 1)
        {
            if (!int.TryParse(arr[0], out integer))
                return string.Empty;
        }
        if (arr.Length == 2)
        {
            if (!int.TryParse(arr[0], out integer))
                return string.Empty;
            if (!int.TryParse(arr[1], out decimals))
                return string.Empty;
        }
        for (int i = 0; i < integer; i++)
        {
            bar += "--";
        }
        if (decimals == 5)
        {
            bar += "-";
        }

        return bar;
    }

    /// <summary>
    /// 是否是中文
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    private static bool IsChinese(char value)
    {
        UnicodeEncoding unicodeencoding = new UnicodeEncoding();
        byte[] unicodebytearray = unicodeencoding.GetBytes(value.ToString());
        bool isChina = false;
        for (int i = 0; i < unicodebytearray.Length; i++)
        {
            i++;
            //如果是中文字符那么高位不为0  
            if (unicodebytearray[i] != 0)
            {
                isChina = true;
                break;
            }
        }
        return isChina;
    }
}

调用:

using System.Data;

namespace CSharpConnectMySQL
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string sql = "SELECT * FROM goods_type";
            DataSet dataSet = MySqlHelper.GetDataSet(sql);
            if (dataSet.Tables.Count == 0) return;
            DataTable dt = dataSet.Tables[0];
            if(dt.Rows.Count > 0)
            {
                ConsoleTool.PrintDataTabele(dt);
            }

            Console.ReadKey();
        }
    }
}

运行:

C# 在控制台整齐的输出 DataTable,C# 核心技术与网络编程,c#

由于数据比较少,看着效果不明显,数据多了效果就更好了

C# 在控制台整齐的输出 DataTable,C# 核心技术与网络编程,c#

C# 在控制台整齐的输出 DataTable,C# 核心技术与网络编程,c#

end文章来源地址https://www.toymoban.com/news/detail-523766.html

到了这里,关于C# 在控制台整齐的输出 DataTable的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • idea在控制台输出debug日志方法

    控制台输出效果如图 方法如下 1.在pom.xml文件中添加如下坐标 2.如果如下报错 则在main/resource下添加log4j.properties文件

    2024年02月20日
    浏览(65)
  • 【DEVOPS】Jenkins使用问题 - 控制台输出乱码

    部门内部对于Jenkins的使用采取的是Master + Slave Work Node的方式,即作为Master节点的Jenkins只负责任务调度,具体的操作由对应的Slave Work Node去执行。 最近团队成员反馈一个问题:一个Linux系统的Slave Work Node的编译日志输出中,中文部分均为乱码(如下图),这造成问题排查效率

    2024年02月11日
    浏览(76)
  • 关于Tomcat控制台输出乱码的若干问题

    ​ 在学习Maven、Tomcat的过程中,发现会在不同的地方出现中文乱码,原本以为是某个设置没有正确,所以,出现乱码。后来发现,需要在不同的地方来进行调整,才能保证Tomcat在控制台的输出,以及Maven过程在参数传递过程中都不会出现乱码。第一次写文章,不怎么会写,大

    2024年02月09日
    浏览(58)
  • Tomcat输出控制台中文乱码问题彻底解决

    目录 文章目录 前言 一、为什么会出现乱码 二、怎么处理乱码问题 1.修改注册表 2.脚步更改配置 三、修改后检查执行 总结         随着互联网的不断发展,软件部署这门技术也越来越重要,很多人在使用Tomcat部署web应用的过程中都遇过诸多的问题,本文就介绍了处理Tomca

    2024年02月08日
    浏览(65)
  • C# 控制台进度条

    https://github.com/Mpdreamz/shellprogressbar

    2024年01月23日
    浏览(73)
  • 编程笔记 Golang基础 011 控制台输入与输出

    Golang控制台输入与输入是用内置的 fmt 包来完成的。初学时要经常用到。 在软件开发工具(如Goland)中,控制台通常指的是集成开发环境(IDE)中的一个组件或面板,它模拟了命令行界面(CLI),允许开发者直接在IDE内部运行和调试程序,以及与操作系统进行交互。这个“控

    2024年02月20日
    浏览(54)
  • Pycharm控制台输出内容太多显示不全

    使用pycharm时经常会出现这样的问题:打印的东西太多,导致向上拉的行数不够,pycharm终端只能显示后面的信息,没办法看到最开始的信息。下面来解决这个问题 1、点击pycharm软件的help 2、找到Edit Custom Properties并进入 3、输入如下几行 如下图所示   1000000代表1000000KB,可自行调

    2024年02月12日
    浏览(66)
  • IDEA 控制台输出中文乱码的简单解决方案

    很多人(包括我)在编程的时候可能会发现:在IDEA的控制台输出中文字符的时候,会出现乱码,如下图: 于是就在网上搜了很多教程,结果弄完了却还是不行。下面是我的解决方案: 其实,问题出在JDK上:JDK18开始,编码变成GBK了,不再是UTF-8,而IDEA的默认配置又是UTF-8,所

    2023年04月18日
    浏览(50)
  • Java学习之Eclipse 控制台中文输出乱码解决

    Eclipse IDE for java Developers 2023-06 版本 缺省情况下,Eclipse将输出中文或非英文字符作为问号(?)或某些奇怪的字符。,它无法显示其他非英语单词。 那么想要在控制台显示中文,我们应该怎么办呢?  先找到run ----再找到里面的 Run Configurations    在跳出的页面的右边选择c

    2024年02月08日
    浏览(65)
  • Jenkins执行流水线项目,控制台输出中文是乱码

    测试环境:         操作系统:Windows 10         Jenkins版本:Jenkins 2.375.1 问题现象: 搭建Jenkins的流水线项目,在Jenkinsfile脚本中想打印中文,运行pipeline后,在Jenkins的Console Output出现乱码 问题原因: 出现Jenkins控制台打印中文乱码问题,通常是由于编码设置不正确导致

    2024年02月06日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包