You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 02:24:06