[C#] TextFieldParser表现不如预期

时间:2017-10-04 01:08:52

标签: c# csv

我正在尝试阅读您可以从此处下载的csv:https://exoplanetarchive.ipac.caltech.edu/cgi-bin/TblView/nph-tblView?app=ExoTbls&config=planets。只需点击“下载表格”,然后选择CSV,所有列,所有行。

代码存在一些问题:

  1. 如何识别评论?我希望类只是跳过它们,不要把它们放在字段变量中。但他们是。
  2. 为什么列数错误?它们是403而不是它找到405.根据pandas(Python3)它们是403.事实上,当我尝试使用TextFieldParser对此csv进行更复杂的操作时,我得到一些错误,如OutOfBoundary与数组的索引相关(当然,列是403,但它们虽然是405)。
  3. 代码:

    private void loadData(string fileName) {
    
                int rows = 0;
                int columns = 0;
    
                using (TextFieldParser parser = new TextFieldParser(fileName, Encoding.UTF8))
                {
                    parser.TextFieldType = FieldType.Delimited;
                    parser.SetDelimiters(",");
                    parser.CommentTokens = new []{"#"};
                    parser.TrimWhiteSpace = false;
                    parser.HasFieldsEnclosedInQuotes = false;
    
                    while (!parser.EndOfData)
                    {
                        //Process row
    
                        string[] fields = parser.ReadFields();
                        foreach (string field in fields)
                        {
                            //TODO: Process field
    
                        }
    
                        if (fields.Length == 0) {
                            //Should be a commment
                            printLine("Comment found on row " + rows);
                        }
    
                        if (fields.Length > columns)
                            columns = fields.Length;
    
                        rows++;
                    }
    
                    printLine ("Rows: " + rows);
                    printLine ("Columns: " + columns);
                    printLine ("Errors on line: " + parser.ErrorLineNumber);
    
                }
    
            }
    

1 个答案:

答案 0 :(得分:0)

要忽略注释行,您需要更改parser.CommentTokens语句以使用新字符串[]如下所示

   parser.CommentTokens = new string []{"#"};

更改后,评论将被忽略。文件中有3行具有不同的列数,然后是403,其他所有列都

我添加了下面的检查,以确定字段数何时大于403(第159,3310和3311行有404和405列/字段)

   if (fields.Length > 403)
     {
       Console.WriteLine($"Line:{lineNo} has {fields.Length}.");
     }

至少你可以对那些超过预期字段数的行进行某种检查/清理