TextFieldParser - 检索ReadFields读取的行

时间:2018-02-22 19:29:33

标签: c# textfieldparser

我正在阅读文本文件,每行应至少有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);
                }
            }
        }

还有其他更合理的方法吗?

1 个答案:

答案 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

注意:

  1. 我不确定解析器如何返回"所包围的字段 - 它们是使用"返回还是没有它,你甚至关心它吗?

  2. 除非遇到这样的行意味着您不再需要处理文件的其余部分,否则我不会抛出异常。如果该列表不为空,您可能希望存储异常列表并在函数末尾抛出一个聚合异常。