2014-08-28 21 views
2

我正在上傳csv文件並將數據保存到數據庫中。我已經完成了保存部分,但我需要的是使用正確的數據farmat來驗證csv。如何使用C驗證asp.net中的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 
     ------------------------------------------- 
  
  

我用Google搜索了很多,但並沒有發現這適合我的問題的有效鏈接。

+0

我不認爲你需要在這裏多谷歌什麼,你必須要嘗試一點,也許讀了一些關於'tryParse'方法。 – 2014-08-28 10:06:41

+1

如何做一個沒有逗號的CSV文件? – RobH 2014-08-28 10:07:03

+0

@RobH,上述表格僅供參考。 – 2014-08-28 10:10:08

回答

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列是否爲正數。

+0

@Phillip Pittle,感謝您的回覆,我正在尋找上面提到的解決方案。 – 2014-08-28 11:23:25

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 
+0

感謝您的答覆,我找到了解決方案。 – 2014-08-28 11:51:42

+0

不客氣。 – 2014-08-28 12:09:28

0

我建議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; 
相關問題