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

时间:2014-08-28 09:56:49

标签: c# asp.net csv

我正在上传csv文件并将数据保存到数据库中。我已经完成了保存部分,但我需要的是用正确的数据farmat验证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
     -------------------------------------------
 
 

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

3 个答案:

答案 0 :(得分:2)

这不会是一个神奇的子弹。通过设计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列是否为正数。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

我会建议使用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;