在C#中将指定格式文本文件解析为嵌套Dictionary的实现
实现文本文件解析为嵌套Dictionary的完整C#方案
我来帮你完成这个文本解析的实现,下面是包含错误处理、逻辑优化的完整代码方案,完全匹配你需要的Dictionary<int, Dictionary<string, double>>结构:
using System; using System.Collections.Generic; using System.IO; using System.Linq; public class NormalizationParser { // 按照需求实现的嵌套字典解析方法 private Dictionary<int, Dictionary<string, double>> OpenNormalization() { var nestedDict = new Dictionary<int, Dictionary<string, double>>(); // 流式读取文件(低内存占用,适合大文件),同时过滤空行 var validLines = File.ReadLines("normalization.txt") .Where(line => !string.IsNullOrWhiteSpace(line)); foreach (string line in validLines) { // 分割每行的三个字段:外层int键、内层string键、double值 var lineParts = line.Split(','); // 校验行格式是否正确 if (lineParts.Length != 3) { Console.WriteLine($"跳过格式错误的行: {line}"); continue; } // 安全转换类型(避免格式错误导致程序崩溃) if (!int.TryParse(lineParts[0], out int outerKey) || !double.TryParse(lineParts[2], out double value)) { Console.WriteLine($"跳过类型转换失败的行: {line}"); continue; } string innerKey = lineParts[1].Trim(); // 去除键值前后的冗余空格 // 处理外层字典:不存在则创建新的内层字典 if (!nestedDict.ContainsKey(outerKey)) { nestedDict[outerKey] = new Dictionary<string, double>(); } // 处理内层字典:如果键已存在,这里选择覆盖原有值(可根据需求改为跳过) if (nestedDict[outerKey].ContainsKey(innerKey)) { Console.WriteLine($"警告:外层键[{outerKey}]下的内层键[{innerKey}]已存在,将覆盖原有值"); } nestedDict[outerKey][innerKey] = value; } return nestedDict; } }
关键逻辑说明
- 高效文件读取:使用
File.ReadLines替代ReadAllLines,流式读取内存占用更低,适合处理大文件;同时过滤空行避免无效处理。 - 健壮的错误处理:
- 校验每行分割后的字段数量,防止数组越界
- 使用
TryParse替代直接Parse,避免因格式错误导致程序崩溃,同时给出清晰的错误提示
- 字典结构维护:
- 先判断外层键是否存在,不存在则创建对应的内层字典
- 处理内层重复键的场景,默认选择覆盖值,你也可以根据需求修改为跳过重复项
- 键值清理:对内层string键做
Trim处理,避免文本中的空格导致键不匹配
示例解析结果
针对你给出的示例文本:
0,ke-2,0.0986089045676918 0,putar,0.141656526869241 1,film,0.110677581313152 1,aveng,0.12035192077391
解析后的嵌套字典结构为:
{ 0: { "ke-2": 0.0986089045676918, "putar": 0.141656526869241 }, 1: { "film": 0.110677581313152, "aveng": 0.12035192077391 } }
内容的提问来源于stack exchange,提问作者Fransiskus Cahyadi Putra
相关产品推荐
相关产品推荐

