如何解析含交替名称与整数列表的文本文件并存入不同数组?
解决读取文本文件并将数据存入对应数组的问题
你已经找对了方向——用正则分割来区分不同组的数据,但分隔符的写法和后续的数组赋值逻辑还需要调整。结合你的文本格式w1; 1 2 3 w2; 3 4 5 w3; 4 5 6,我给你梳理两种可行的实现方案:
方案1:处理单行文本内容(文件只有一行数据)
如果你的文本文件是整行内容,用File.ReadAllText读取后,通过正则分割提取各组数据,再转换为int数组:
using System; using System.IO; using System.Text.RegularExpressions; class Program { static void Main() { // 初始化三个目标数组 int[] w1 = new int[3]; int[] w2 = new int[3]; int[] w3 = new int[3]; // 读取整个文件的内容 string fileContent = File.ReadAllText(@"D:\\Data.txt"); // 用正则分割,匹配"w数字; "这样的分隔符,把各组数据拆分出来 string[] dataSegments = Regex.Split(fileContent, @"w\d+; "); // 分割后第一个元素是空字符串(因为文本开头就是w1;),所以从索引1开始对应各组数据 if (dataSegments.Length >= 4) { // 处理w1的数据:按空格分割字符串,再转成int赋值到数组 AssignDataToIntArray(dataSegments[1], w1); // 处理w2的数据 AssignDataToIntArray(dataSegments[2], w2); // 处理w3的数据 AssignDataToIntArray(dataSegments[3], w3); } // 测试输出验证结果 Console.WriteLine("w1: " + string.Join(", ", w1)); Console.WriteLine("w2: " + string.Join(", ", w2)); Console.WriteLine("w3: " + string.Join(", ", w3)); } // 封装一个通用方法,把字符串数据转成int数组,避免重复代码 private static void AssignDataToIntArray(string dataStr, int[] targetArray) { string[] numberStrs = dataStr.Trim().Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < numberStrs.Length && i < targetArray.Length; i++) { // 用TryParse避免非数字内容导致程序崩溃 int.TryParse(numberStrs[i], out targetArray[i]); } } }
方案2:处理多行文本内容(每个wX; 单独占一行)
如果你的文件是每行一个数据组(比如w1; 1 2 3单独一行),用File.ReadAllLines遍历每行,通过分号分割键和数据,再根据键赋值对应数组,这种写法更灵活:
using System; using System.IO; class Program { static void Main() { int[] w1 = new int[3]; int[] w2 = new int[3]; int[] w3 = new int[3]; foreach (string line in File.ReadAllLines(@"D:\\Data.txt")) { // 按分号分割键和数据部分 string[] lineParts = line.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries); if (lineParts.Length != 2) continue; // 跳过格式不正确的行 string key = lineParts[0].Trim(); string dataStr = lineParts[1].Trim(); // 根据键匹配对应的数组赋值 switch (key) { case "w1": AssignDataToIntArray(dataStr, w1); break; case "w2": AssignDataToIntArray(dataStr, w2); break; case "w3": AssignDataToIntArray(dataStr, w3); break; } } // 验证输出 Console.WriteLine("w1: " + string.Join(", ", w1)); Console.WriteLine("w2: " + string.Join(", ", w2)); Console.WriteLine("w3: " + string.Join(", ", w3)); } private static void AssignDataToIntArray(string dataStr, int[] targetArray) { string[] numberStrs = dataStr.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < numberStrs.Length && i < targetArray.Length; i++) { int.TryParse(numberStrs[i], out targetArray[i]); } } }
关键说明
- 用
StringSplitOptions.RemoveEmptyEntries可以自动过滤分割后出现的空字符串,避免处理无效数据; - 用
int.TryParse替代int.Parse,哪怕文本里有非数字内容,程序也不会直接崩溃,只会跳过无效值; - 封装
AssignDataToIntArray方法是为了避免重复写相同的赋值逻辑,让代码更简洁易维护。
内容的提问来源于stack exchange,提问作者Danki
相关产品推荐
相关产品推荐

