我正在从文本文件中读取数据,每行应该至少有 9 个字段。一些数据只有 5 个字段,因此 ReadFields() 有效,并且在访问字段 [8] 时出现异常。我宁愿抛出一个自定义异常,显示未完成的行。
TextFieldParse
似乎没有用于检索ReadFields()
刚刚处理的行的属性。
using (var parser = new TextFieldParser(filename))
{
parser.HasFieldsEnclosedInQuotes = true;
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
while (!parser.EndOfData)
{
linenum++;
var fields = parser.ReadFields(); // fields 0...N
想在此处添加异常消息返回“短”行
if (fields.length < 10) {
rawline = ????
throw new Exception ("ERROR: " + filename
+ " not enough data at [" + rawline + "]"
);
}
正常处理
string name = fields[0];
double cost = Convert.ToDouble(fields[8]);
// ... add info to a list
}
}
一种可能性是使用 TextReader 来读取每一行,并为每一行使用一个新的 TextFieldParser 作为 MemoryStream - 似乎太多了
using (var reader = new StreamReader(filename))
{
var line = reader.ReadLine();
// new Parser and Stream for every line, bleah!
using (var parser = new TextFieldParser(
new MemoryStream(Encoding.ASCII.GetBytes(line))))
{
parser.HasFieldsEnclosedInQuotes = true;
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
var fields = parser.ReadFields();
if (fields.Length < 9)
{
throw new Exception("too few fields: " + line);
}
}
}
还有其他更合理的方法吗?