我正在阅读文本文件,每行应至少有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);
}
}
}
还有其他更合理的方法吗?
答案 0 :(得分:0)
string.Join
怎么样?
while (!parser.EndOfData)
{
linenum++;
var fields = parser.ReadFields(); // fields 0...N
if (fields.length < 10)
{
var rawline = string.Join(",", fields);
throw new Exception ("ERROR: " + filename
+ " not enough data at [" + rawline + "]");
}
// ... rest of the code here
注意:
我不确定解析器如何返回"
所包围的字段 - 它们是使用"
返回还是没有它,你甚至关心它吗?
除非遇到这样的行意味着您不再需要处理文件的其余部分,否则我不会抛出异常。如果该列表不为空,您可能希望存储异常列表并在函数末尾抛出一个聚合异常。