分享一个把表格类型的数据转换成字符串,以表格样式输出,方便控制台和日志记录时更直观

ops/2024/12/25 9:43:21/

调用实例:

Console.WriteLine("Hello, World!");List<string[]> tabLog = new List<string[]>();
tabLog.Add(new string[] { "编号", "姓名", "性别", "年龄","备注" });
tabLog.Add(new string[] { "1", "张三", "男", "12","这个地方的数据可能很长" });
tabLog.Add(new string[] { "2", "李四", "不清不楚的", "15", "这个地方的数据可能很长很长" });
tabLog.Add(new string[] { "3", "王五", "女", "10" ,"短了"});var strLog = TableDataToStr(tabLog.ToArray());Console.WriteLine(strLog);

依赖方法:

/// <summary>/// 根据asc码来判断字符串的长度,在0~127间字符长度加1,否则加2/// </summary>/// <returns>需要返回长度的字符串 </returns>public static int TrueLength(string str){int lenTotal = 0;int n = str.Length;string strWord = "";  //清空字符串int asc;for (int i = 0; i < n; i++){strWord = str.Substring(i, 1);asc = Convert.ToChar(strWord);if (asc < 0 || asc > 127)      // 在0~127间字符长度加1,否则加2{lenTotal = lenTotal + 2;}else{lenTotal = lenTotal + 1;}}return lenTotal;}/// <summary>/// 统一字符串的长度/// <param name="strOriginal">初始字符串</param>/// <param name="maxTrueLength">规定统一字符串的长度</param>/// </summary>///  <returns>返回统一后的字符串</returns>public static string PadRightTrueLen(string strOriginal, int maxTrueLength){const char chrPad = ' ';string strNew = strOriginal;if (strOriginal == null || maxTrueLength <= 0){strNew = "";return strNew;}int trueLen = TrueLength(strOriginal);if (trueLen < maxTrueLength){// 填充  小于规定长度 用' '追加,直至等于规定长度for (int i = 0; i < maxTrueLength - trueLen; i++){strNew += chrPad.ToString();}}else{throw new Exception("当前的长度大于了最大的长度maxTrueLength");}return strNew;}/// <summary>/// 表格数据转字符串/// </summary>/// <param name="table"></param>/// <returns></returns>public static string TableDataToStr(string[][] table){bool createGap = false;reset:List<Tuple<int, int, StringBuilder, int>> lst = new List<Tuple<int, int, StringBuilder, int>>();for (int i = 0, length = table.Length; i < length; i++){string[] r = table[i];for (int j = 0, length2 = r.Length; j < length2; j++){var cell = new StringBuilder(r[j]);int tl = TrueLength(cell.ToString());lst.Add(new Tuple<int, int, StringBuilder, int>(i, j, cell, tl));}}if (!createGap){// 最长的列追加间隙foreach (var item in lst){var max = lst.Where(c => c.Item2 == item.Item2).OrderByDescending(c => c.Item4).First();if (item.Item4 == max.Item4){table[item.Item1][item.Item2] = $"{item.Item3.ToString()}   ";}}createGap = true;goto reset;}foreach (var item in lst){var max = lst.Where(c => c.Item2 == item.Item2).OrderByDescending(c => c.Item4).First();if (item.Item4 < max.Item4){var old = item.Item3.ToString();item.Item3.Clear();item.Item3.Append(PadRightTrueLen(old, max.Item4));}}StringBuilder str = new StringBuilder();for (int i = 0, length = table.Length; i < length; i++){string[] r = table[i];for (int j = 0, length2 = r.Length; j < length2; j++){str.Append(lst.First(c => c.Item1 == i && c.Item2 == j).Item3.ToString());}if (i != length - 1){str.AppendLine();// 换行}}return str.ToString();}


http://www.ppmy.cn/ops/144819.html

相关文章

Kubernetes使用Ceph存储

1.搭建Ceph集群 1&#xff09;准备工作 机器编号 主机名 IP 1 ceph1 192.168.1.121 2 ceph2 192.168.1.123 3 ceph3 192.168.1.125 关闭selinux、firewalld&#xff0c;配置hostname以及/etc/hosts 为每一台机器都准备至少一块单独的磁盘 所有机器安装时间同步服…

【国产NI替代】基于FPGA的4通道电压 250M采样终端边缘计算采集板卡,主控支持龙芯/飞腾

4通道电压 250M采样终端边缘计算采集板卡 采用Arria10 SOC型号的FPGA&#xff0c;最高采样率能到 250M&#xff0c;主要为高速计算提供硬件平台。

uniapp抖音小程序,如何一键获取用户手机号

前端部分 点击按钮&#xff0c;获取手机号 <button class"button" open-type"getPhoneNumber" getphonenumber"getPhoneNumber">一键获取</button> 传入sessionKey和encryptedData、iv 其中sessionKey是通过登录时&#xff0c;调…

k8s总结

1、k8s是部署、拓展、管理容器的容器编排引擎。可根据负载的变化动态增加或缩减节点保证系统的高可用。 2、ks8s核心组件&#xff1a;node是节点&#xff08;可以是物理机也可以是虚拟机&#xff09;、pod最小的调度单位&#xff0c;是容器的抽象&#xff0c;有svc管理容器网络…

【序】前端监控:打造高效稳定的用户体验

前端监控&#xff1a;打造高效稳定的用户体验 为什么需要前端监控&#xff1f; 在现代前端开发中&#xff0c;用户体验至关重要。无论是页面性能问题、JavaScript 报错&#xff0c;还是网络请求的失败&#xff0c;都可能影响用户的满意度。前端监控可以帮助我们&#xff1a; …

PostgreSQL的交互式终端使用一系列命令来获取有关文本搜索配置对象的信息

在 psql&#xff08;PostgreSQL 的交互式终端&#xff09;中&#xff0c;你可以使用一系列命令来获取有关文本搜索配置对象的信息。这些命令主要围绕 \dF 系列&#xff0c;以及使用 SQL 查询 pg_ts_config 系统视图。以下是你可以使用的一些方法&#xff1a; 使用 \dF 系列命令…

专业的内外网数据交换方案 可解决安全、效率、便捷3大问题

内外网数据交换是很多企业和行业都会面临的场景&#xff0c;既然隔离了内外网&#xff0c;重中之重就是要确保数据的安全性&#xff0c;其次在数据流转交换过程中&#xff0c;不能太繁琐复杂&#xff0c;需要让用户快速、便捷的进行数据交换。首先我们来看看&#xff0c;在进行…

【Vue3学习】使用ref调用子组件的方法,实现子组件的显示与隐藏

不同于v2的写法,在v3中,子组件的方法和变量需要用defineExpose 暴露出去,defineExpose 是 Vue 3 提供的一个 API&#xff0c;用于显式地暴露组件中的方法或属性给外部&#xff08;通常是父组件&#xff09;。它的主要用途是让你能够控制哪些内容可以被父组件通过 ref 或 $refs …