【问题标题】:C# Parsing a text file misses the first line of every text fileC#解析文本文件会丢失每个文本文件的第一行
【发布时间】:2018-07-20 14:14:01
【问题描述】:

我正在从文本文件制作一个数字到音符值转换器,但在我的 C# 代码中解析文本文件时遇到问题。流阅读器或解析器似乎忽略了来自不同文本文件的每一行文本,我正在从解析 CSV 中学习,并假设我可以像解析 CSV 文件一样解析文本文件。这是我的代码:

static List<NoteColumns> ReadNoteValues(string fileName)
    {
        var allNotes = new List<NoteColumns>();
        using (var reader = new StreamReader(fileName))
        {
            string line = "";
            reader.ReadLine();
            while ((line = reader.ReadLine()) != null)
            {
                string[] cols = line.Split('|');
                var noteColumn = new NoteColumns();
                if (line.StartsWith("-"))
                {
                    continue;
                }
                double col;
                if (double.TryParse(cols[0], out col))
                {
                    noteColumn.QCol = col;
                }
                if (double.TryParse(cols[1], out col))
                {
                    noteColumn.WCol = col;
                }
            }
        }
        return allNotes;
    }

这是我的一个文本文件的前 4 行:

0.1|0.0|
0.0|0.1|
0.3|0.0|
0.1|0.0|

所以每次我有输出时,它总是会跳过第一行并移动到下一行。在错过第一行之后,它会完美地转换所有其他值。

我曾尝试使用 foreach 循环,但最终得到“索引超出范围异常”。我错过了什么/愚蠢吗?感谢您的宝贵时间

【问题讨论】:

  • 在循环之前去掉reader.ReadLine
  • reader.ReadLine() 在循环之前
  • 如果您为某些 CSV 解析算法复制了该代码,则 reader.ReadLine 之前的 while 循环很可能故意跳过第一行,因为它预计这是列的标题行.

标签: c# parsing


【解决方案1】:

您在循环之前调用了reader.ReadLine();,但您没有分配给任何东西

【讨论】:

  • 天哪,我真傻。谢天谢地你的好眼睛!非常感谢您的帮助!
  • Np,这一直发生在我身上,有时你只需要第二双眼睛就能发现问题,
【解决方案2】:

这是因为你已经在跳过第一行的while循环之前添加了ReadLine()

【讨论】:

    【解决方案3】:

    为了避免这样的错误(错误的reader.ReadLine()开头)完全摆脱Readers和查询文件Linq(让 .Net 打开和关闭文件,逐行读取并为您完成所有低级工作):

    using System.IO;
    using System.Linq;
    
    ...  
    
    static List<NoteColumns> ReadNoteValues(string fileName) {
      return File
        .ReadLines(fileName)
        .Where(line => !line.StartsWith('-'))
        .Select(line => line.Split('|'))
        .Select(cols => {
            var noteColumn = new NoteColumns();
    
            if (double.TryParse(cols[0], out var col))
              noteColumn.QCol = col;
    
            if (double.TryParse(cols[1], out var col))
              noteColumn.WCol = col;
    
            return noteColumn;  
         })
        .ToList();
    }
    

    【讨论】:

    • 哇,这解决了 OP 的问题并清理了代码 +1
    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多