C#读取文本文件定位指定国家行时读取到下一行如何解决
问题描述
我正在读取一个包含大洲、国家、首都及对应国家人口数据的文本文件,文件为固定宽度列布局。当我输入查询值(例如输入“Birmanie”)时,StreamReader 实例会读取下一行的“Bolivie”数据,其中 Pays 为输入的查询参数。我的目标是读取用户输入的国家对应的那一行数据,后续再从该行中提取所需信息。
我的代码如下:
while (!srRecherche.EndOfStream) { lireLigneRechercher = srRecherche.ReadLine(); if (lireLigneRechercher.IndexOf(Pays,StringComparison.CurrentCultureIgnoreCase) >= 0) { for (int i = 1; i <= 35; i++) { lireCharacteres += (char)srRecherche.Read(); } for (int i = 1; i <= 74; i++) { srRecherche.Read(); } } }
上述代码中的 for 循环用于跳过其余信息,仅读取国家名称。
解决方案
你遇到的问题是调用ReadLine()读取匹配行之后,流的指针已经移动到了下一行的起始位置,后续用Read()读取的都是下一行的内容,所以拿到的是Bolivie的数据。
你已经把匹配到的整行内容完整存储在lireLigneRechercher变量中,直接从该字符串里按规则截取字段即可,不需要再操作StreamReader读取流内容:
while (!srRecherche.EndOfStream) { string lireLigneRechercher = srRecherche.ReadLine(); // 优先校验国家列匹配,避免其他列出现相同字符导致误匹配,示例假设国家列在首列,占35字符 string currentPays = lireLigneRechercher.Substring(0, 35).Trim(); if (currentPays.Equals(Pays, StringComparison.CurrentCultureIgnoreCase)) { // 读取国家名称 string nomPays = currentPays; // 示例:读取后续其他字段,根据你的实际列宽调整起始位置和长度即可 // string capitale = lireLigneRechercher.Substring(35, 30).Trim(); // long population = long.Parse(lireLigneRechercher.Substring(65, 10).Trim()); // 匹配到目标后直接跳出循环,减少不必要的IO操作 break; } }
优化建议
- 如果你的文本是用分隔符(制表符、分号、逗号等)分割列,用
Split()方法拆分字段比固定长度截取兼容性更好,适配列宽变动的场景 - 建议提前确认每列的起始偏移和长度,避免截取字段时出现错位
内容的提问来源于stack exchange,提问作者night
相关产品推荐
相关产品推荐

