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