0

我正在从文本文件中读取数据,每行应该至少有 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);
                }
            }
        }

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

4

1 回答 1

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

于 2018-02-22T20:09:03.480 回答