【问题标题】:How to validate the csv file in asp.net with C#如何使用 C# 在 asp.net 中验证 csv 文件
【发布时间】:2014-08-28 09:56:48
【问题描述】:

我正在上传 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
     -------------------------------------------
 
 

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

【问题讨论】:

  • 我不认为你需要在这里搜索任何东西,你只需要稍微尝试一下,也许可以阅读一些关于 tryParse 方法的内容。
  • 没有一个逗号怎么可能是 CSV 文件?
  • @RobH,以上表格仅供参考。
  • CSV 的问题在于没有规范:/
  • @Ms.Nobody,谢谢回复,我认为tryparse不是完整的解决方案.....,如果客户尝试,csv文件的架构需要与第一个表相同要上传 csv 文件不同的架构,则需要引发错误消息。解决方案不一定像获取每一行并拆分和比较,我需要架构并验证架构。

标签: c# asp.net csv


【解决方案1】:

这不会是灵丹妙药。通过设计 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 列是否为正数。

【讨论】:

  • @Phillip Pittle,感谢您的回复,我正在寻找您上面提到的解决方案。
【解决方案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

【讨论】:

  • @SantoshKumar 你能告诉我解决方案吗
【解决方案3】:

我建议使用 CsvHelper,它是很棒的 CSV 库,并且有一些方法可以处理格式错误的 CSV,这里是:https://github.com/JoshClose/CsvHelper

查看文档:

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

有一个例子,当 CSV 是 mallformed 时如何读取文件并做一些事情:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2011-04-20
    • 1970-01-01
    • 2015-10-18
    相关资源
    最近更新 更多