如何可靠解析指定格式的字符串数据并存储至数据库?
解决C#解析特定格式字符串的问题
看起来你在解析这种固定格式的字符串时遇到了参数错误和逻辑混乱的问题,咱们一步步来修正它。首先明确你的需求:从Finish@Store@...@$格式的字符串里,提取每个@分隔的记录中的前三个字段(比如000019411:02:48.499 1 0C),跳过后面的冗余部分。
原代码的核心问题
- 重复声明
string substr,这会直接导致编译错误 Substring参数使用错误:Substring(startIndex, length)的第二个参数是长度,你误写成了结束索引,这直接导致提取的内容完全偏离预期- 循环中x和y的更新逻辑没有依据,毫无章法的数值累加会触发
ArgumentOutOfRangeException(字符串越界访问)
正确的解析方案
我们可以用更清晰的字符串分割思路来实现,步骤更直观也更可靠:
- 先剥离字符串前后的无关部分:去掉开头的
Finish@Store@和结尾的@$ - 把剩下的核心内容按
@分割成单个记录的数组 - 遍历每个记录,按空格分割后取前三个元素,拼接成目标格式的内容
下面是完整的可运行代码:
string data = "Finish@Store@000019411:02:48.499 1 0C 138D71802103D@000080211:03:16.530 1 0F 138D81802102B@000088211:04:10.546 1 0D 138D918021034@000023011:04:45.809 1 0F 138DA1802103B@000019411:04:47.202 1 08 238DB1802102D@000025111:05:51.550 1 0F 138DC18021037@000088111:05:53.429 1 0F 138DD18021048@11@$"; // 1. 先验证输入字符串的格式是否符合要求 if (data.StartsWith("Finish@Store@") && data.EndsWith("@$")) { // 提取中间的核心记录内容:去掉开头的固定前缀和结尾的固定后缀 int prefixLength = "Finish@Store@".Length; int suffixLength = "@$".Length; string coreContent = data.Substring(prefixLength, data.Length - prefixLength - suffixLength); // 2. 按@分割成单个记录,同时移除空条目(避免分割出无效的空字符串) string[] records = coreContent.Split(new[] { '@' }, StringSplitOptions.RemoveEmptyEntries); // 3. 遍历每个记录,提取前三个字段 List<string> extractedParts = new List<string>(); foreach (string record in records) { // 跳过空记录或者格式异常的记录(比如示例里的"11") if (string.IsNullOrWhiteSpace(record)) continue; string[] fields = record.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); // 确保记录至少有3个字段才提取,避免索引越界 if (fields.Length >= 3) { extractedParts.Add($"{fields[0]} {fields[1]} {fields[2]}"); } } // 4. 把所有提取的部分拼接成最终结果 string result = string.Join(" ", extractedParts); Console.WriteLine("提取结果:"); Console.WriteLine(result); } else { Console.WriteLine("输入字符串格式不符合要求,请检查数据"); }
代码解释
- 格式校验:先用
StartsWith和EndsWith确保输入符合预期格式,避免后续处理无意义的错误数据 - 核心内容提取:精准计算截取长度,彻底剥离前后无关的固定字符串
- 记录分割:用
Split方法拆分记录时,通过StringSplitOptions.RemoveEmptyEntries自动过滤空条目,减少异常情况 - 字段提取:对每个记录做格式检查,确保有足够的字段再提取,避免索引越界
- 结果拼接:用空格连接所有有效提取的字段,得到你需要的输出格式
运行这段代码后,会输出符合你预期的结果:
000019411:02:48.499 1 0C 000080211:03:16.530 1 0F 000088211:04:10.546 1 0D 000023011:04:45.809 1 0F 000019411:04:47.202 1 08 000025111:05:51.550 1 0F 000088111:05:53.429 1 0F
这样既解决了原代码的越界和内容提取错误问题,还增加了异常处理,让代码更健壮可靠。
内容的提问来源于stack exchange,提问作者cfcorp
相关产品推荐
相关产品推荐

