C#解析文本文件会丢失每个文本文件的第一行

时间:2018-07-20 14:14:01

标签: c# parsing

我正在从文本文件转换为音符值转换器,并且在解析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循环,但最终遇到“索引超出范围异常”。我是否想念某些东西/变得愚蠢?谢谢您的时间

3 个答案:

答案 0 :(得分:4)

在循环之前您有一个呼叫reader.ReadLine();的呼叫,您没有为其分配任何内容

答案 1 :(得分:4)

这是因为您已经在while循环之前添加了ReadLine(),从而跳过了第一行

答案 2 :(得分:1)

为了避免出现此类错误(开头是错误的reader.ReadLine()),为了避免出现这些错误(开头是错误的Reader),并使用< em> 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();
}