C#处理Excel耗材报表统计指定关键词仅统计到antena问题排查
问题排查与修复方案
核心问题清单
- 仅查询单条记录:代码中使用
FirstOrDefault()只获取了第一条符合过滤条件的耗材记录,其余所有行的耗材数据完全未参与统计,这是最核心的问题。 - 多余无效的外层循环:
foreach (var s in suppliesquery.ToString().ToLower())是遍历字符串的单个字符,会导致内部的拆分统计逻辑重复执行N次(N为字符串长度),最终统计结果是实际值的N倍,逻辑完全错误,该层循环可以直接删除。 - 匹配规则问题:
- 拼写不匹配:需求要统计的英文关键词
battery、antenna,但报表中的实际值是Bateria、Antena拼写,代码中的匹配字符串和需求、报表实际值三者不统一,导致匹配不到目标内容。 - 完全匹配限制过严:switch中天线的匹配规则是必须完全等于
antena plana,如果报表中存在单独的Antena无Plana后缀的记录,会直接匹配失败。 - 未处理空白字符:拆分字符串后没有做Trim处理,若报表中逗号后带有空格(比如
Antena Plana, Bateria),拆分出来的Bateria会因为带前导空格无法匹配case。
- 拼写不匹配:需求要统计的英文关键词
- 统计范围错误:现有逻辑只统计单个记录的耗材,应该遍历所有符合条件的
TaskSuppliesUsed记录,而非仅取第一条。
修复后参考代码
// 查询所有符合条件的耗材记录,不要用FirstOrDefault取单条 var suppliesList = (from sm in db.TaskSuppliesUsed let suppliesLower = sm.suppliesUsed.ToString().ToLower() where suppliesLower.Contains("bateria") || // 和报表实际值统一 suppliesLower.Contains("antena") || suppliesLower.Contains("sim") || suppliesLower.Contains("simcard") select sm).ToList(); int bateria = 0; int simcard = 0; int antena = 0; // 遍历所有耗材记录 foreach (var record in suppliesList) { // 拆分后先Trim空白字符再匹配 string[] insumos = record.suppliesUsed.ToString().ToLower() .Split(',') .Select(x => x.Trim()) .ToArray(); foreach (var i in insumos) { switch (i) { case "bateria": bateria++; break; case "sim": case "simcard": simcard++; break; // 如果需要同时匹配带plana和不带的,可调整为两个case或者用包含判断 case "antena": case "antena plana": antena++; break; } } }
内容的提问来源于stack exchange,提问作者Enrico Grez
相关产品推荐
相关产品推荐

