将TXT文件存入数据库并计算tCode使用占比的技术咨询
问题与解决方案
原始文件内容
first.txt的内容如下:
tCodeA;tCodeB;tCodeC tCodeB;tCodeC tCodeD;tCodeA tCodeB
每行代表一个Package,Package包含的tCode以分号分隔。
问题1:将文本数据按行存储到数据库(列表/数组形式)
数据库表设计
以SQL Server为例,创建Packages表,用JSON格式存储tCode列表(若用PostgreSQL可直接使用数组类型):
CREATE TABLE Packages ( Id INT IDENTITY(1,1) PRIMARY KEY, TCodeList NVARCHAR(MAX) NOT NULL -- 存储JSON数组,例如["tCodeA","tCodeB"] );
C#实现代码
修改原读取文件方法,添加数据库插入逻辑,用using语句自动释放资源:
using System; using System.IO; using System.Data.SqlClient; using Newtonsoft.Json; // 需安装Newtonsoft.Json NuGet包,或改用System.Text.Json public void DbBuilder() { string connectionString = "你的数据库连接字符串"; string filePath = @"C:\first.txt"; using (StreamReader sr = new StreamReader(filePath)) { string line; while ((line = sr.ReadLine()) != null) { // 拆分每行tCode并转为字符串数组 string[] tCodes = line.Split(';', StringSplitOptions.RemoveEmptyEntries); // 序列化为JSON字符串 string tCodeJson = JsonConvert.SerializeObject(tCodes); // 插入数据库 using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); string sql = "INSERT INTO Packages (TCodeList) VALUES (@TCodeList)"; using (SqlCommand cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@TCodeList", tCodeJson); cmd.ExecuteNonQuery(); } } } } Console.WriteLine("数据导入完成"); }
问题2:计算输入tCode的使用占比
逻辑说明
占比公式:(包含目标tCode的行数 ÷ 总行数) × 100%
- 总行数:
Packages表的总记录数 - 匹配行数:查询TCodeList中包含目标tCode的记录数(通过JSON函数判断)
C#实现代码
编写方法接收用户输入,计算并返回占比:
using System; using System.Data.SqlClient; public decimal CalculateTCodeUsageRatio(string targetTCode) { string connectionString = "你的数据库连接字符串"; int totalRows = 0; int matchedRows = 0; using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); // 获取总行数 string countSql = "SELECT COUNT(*) FROM Packages"; using (SqlCommand cmd = new SqlCommand(countSql, conn)) { totalRows = (int)cmd.ExecuteScalar(); } // 获取包含目标tCode的行数(SQL Server 2016+支持OPENJSON) string matchSql = @" SELECT COUNT(*) FROM Packages WHERE EXISTS ( SELECT 1 FROM OPENJSON(TCodeList) WHERE value = @TargetTCode )"; using (SqlCommand cmd = new SqlCommand(matchSql, conn)) { cmd.Parameters.AddWithValue("@TargetTCode", targetTCode); matchedRows = (int)cmd.ExecuteScalar(); } } if (totalRows == 0) return 0; // 计算占比并保留两位小数 return Math.Round((decimal)matchedRows / totalRows * 100, 2); } // 调用示例 public void RunRatioCalculation() { Console.Write("请输入要查询的tCode(多个用逗号分隔):"); string input = Console.ReadLine().Trim(); string[] targetCodes = input.Split(',', StringSplitOptions.RemoveEmptyEntries); foreach (string code in targetCodes) { decimal ratio = CalculateTCodeUsageRatio(code); Console.WriteLine($"tCode {code} 的使用占比:{ratio}%"); } }
内容的提问来源于stack exchange,提问作者Mardibak
相关产品推荐
相关产品推荐

