如何使用C#验证asp.net中的csv文件

本文关键字:中的 csv 文件 net asp 何使用 验证 | 更新日期: 2023-09-27 18:19:52

我正在上传csv文件并将数据保存到数据库中。我已经完成了保存部分,但我需要的是用正确的数据农场验证csv。

 -----------------------------------------------
    Name  Address    Age  Gender
    ---------------------------------------------
    a        Hyderabad  23     M
    b         Banglore 25   F
    c        Mumbai    26 M
    ---------------------------------------------
 

csv文件中的数据在上传时需要采用上述格式。如果他们以以下格式输入数据并试图上传,则需要显示一条错误消息,上面写着"上传有效CSV文件"。

 -----------------------------------------------
    Name  Address   (Column Name Is missing)  Gender| Column0
    --------------------------------------------
    a       Hyderabad  23  M       ( Some Junk Data)
    b       Banglore 25   F         | 
    c        Mumbai  26   M       |
    ---------------------------------------------
     
    --------------------------------------------
    Xyz        olp
     -------------------------------------------
 
 

我在谷歌上搜索了很多,但没有找到适合我问题的有效链接。

如何使用C#验证asp.net中的csv文件

这不会有灵丹妙药。通过设计CSV,如果它是流动的,那么你将无法像验证xml文件一样验证它。

但是你可以做一些事情,例如:

 public void ValidateCsv(string fileContents)
 {
     var fileLines = fileContents.Split(
           new string[] { "'r'n", "'n" }, StringSplitOptions.None);
      if (fileLines.Count < 2)
         //fail - no data row.
      ValidateColumnHeader(fileLines[0]);
      ValidateRows(fileLines.Skip(1));
 }
 public bool ValidateColumnHeaders(string header)
 {
      return header.Trim().Replace(' ','').ToLower() == 
         "name,address,age,gender";
 }
 public bool ValidateRows(IEnumerable<string> rows)
 {
      foreach(row in rows)
      {
          var cells = row.Split(',');
           //check if the number of cells is correct
           if (!cells.Length == 4)
                return false;
           //ensure gender is correct
           if (cells[3] != "M" && cells[3] != "F")
               return false;
           //perform any additional row checks relevant to your domain
      }
 }

大多数验证都是针对您的业务领域的,因此您需要自己决定什么是"坏数据"。例如,您可以检查Age列是否为正数。

使用正则表达式。如果你在csv文件中的每一行都有一个特定的模板,我认为regex是最好的解决方案。这里有一个例子:

Template: 12345[tab]String(20 chars)[tab]String(1 char an one of these: M,N,O)
Regex: ^[0-9]{1,5}(' ){0,4}'t.{20}'t[MNO]$
Lines:
12345   abcdefg                 M  --->Match
54345   abcdefg ghft            O  --->Match
12      vfjnvfjn vfjnvfn    K      --->No Match because it is faulty
12      vfjnvfjn vfjnvfn        N  --->Match

我建议使用CsvHelper,它是一个很棒的CSV库,有一些方法可以处理格式错误的CSV,如下所示:https://github.com/JoshClose/CsvHelper

查看文档:

http://joshclose.github.io/CsvHelper/

有一个示例,当CSV格式错误时,如何读取文件并执行操作:

var csv = new CsvReader( textReader );
while( csv.Read() )
{
    int intField;
    if( !csv.TryGetField( 0, out intField ) )
    {
        // Do something when it can't convert.   
    }
}

请务必查看上面链接上的文档,有一个选项可以忽略读取异常:

csv.Configuration.IgnoreReadingExceptions = true;