2013-05-17 33 views
2

我有一些.csv文件,我將其存儲在數據庫之前解析。如何在存儲在C#之前驗證.csv文件?

我想使應用程序更健壯,並在保存到數據庫之前對.csv文件執行驗證。

所以,我問你們,如果你有一些很好的鏈接,或代碼示例,模式或建議如何做到這一點?

我會在下面粘貼一個.csv文件的例子。 .csv文件中的不同數據字段由製表符分隔。每一行新的數據都在新的一行上。

我一直在想一些我應該驗證的事情,並提出了下面的列表(我對其他建議非常開放,以防您有什麼想法應該添加到列表中)

Correct file encoding. 
That file is not empty. 
Correct number of lines/columns. 
correct number/text/date formats. 
correct number ranges. 

這就是我的.csv文件的外觀(兩行文件,一行數據被製表符分隔)。

4523424 A123456 GT-P1000 mobile phone Samsung XSD1234 135354191325234 
345353 A134211 A8181 mobile phome HTC S4112-ad3 111911911932343 

的上面的字符串表示的樣子:

"4523424\tA123456\tGT-P1000\tmobile phone\tSamsung\tXSD1234\t135354191325234\r 

\n345353\tA134211\tA8181\tmobile phome\tHTC\tS4112-ad3\t111911911932343\r\n" 

所以,你有什麼好的設計,鏈接,模式,代碼示例等就如何做到這一點在C#中?

+3

你想驗證什麼?結構?如果每行包含與其他行一樣多的選項卡?或者你想驗證日期?像最小值和最大值一樣?或數據類型? –

回答

-2

adrianm和Nipun Ambastha

謝謝您的回答我的問題。

我通過編寫解決方案來自己驗證我的.csv文件來解決我的問題。

通過使用adrianm的代碼,很可能會有更優雅的解決方案,但我沒有那樣做,但我很鼓勵給adrianm的代碼一下。

我在驗證以下列表。

  • 空文件 新的FileInfo(dto.AbsoluteFileName)。長度== 0

  • 的文件行錯誤的格式。 string [] items = line.Split('\ t'); (items.Count()== 20)

  • 行字段中的數據類型不正確。 int number; bool isNumber = int.TryParse(dataRow.ItemArray [0] .ToString(),out number);

  • 缺少所需的行字段。 如果(dataRow.ItemArray [4]的ToString()長度< 1)

要通過我基於我對這個代碼示例代碼.csv文件中的內容的工作:

http://bytes.com/topic/c-sharp/answers/256797-reading-tab-delimited-file

+1

你真的認爲你自己的答案是更好的標記爲接受? –

+0

我很抱歉,但現在我實際上已經忘記了這是關於什麼的。但對我自己而言,我寫的答案只是解決當時問題的最快途徑。 – RuneHansen

+0

這裏是一個更好的答案http://stackoverflow.com/a/25546429/2009536 – avenda

1

您可以使用FileHelpers免費/開源的.Net庫來處理CSV和許多其他文件格式。

2

我這樣做:

創建一個類來保存與期望類型

internal sealed class Record { 
    public int Field1 { get; set; } 
    public DateTime Field2 { get; set; } 
    public decimal? PossibleEmptyField3 { get; set; } 
    ... 
} 

每個解析線創建分析一行到記錄的方法

public Record ParseRecord(string[] fields) { 
    if (fields.Length < SomeLineLength) 
     throw new MalformadLineException(...) 

    var record = new Record(); 

    record.Field1 = int.Parse(fields[0], NumberFormat.None, CultureInvoice.InvariantCulture); 
    record.Field2 = DateTime.ParseExact(fields[1], "yyyyMMdd", CultureInvoice.InvariantCulture); 
    if (fields[2] != "") 
     record.PossibleEmptyField3 = decimal.Parse(fields[2]...) 

    return record; 
} 

創建方法解析整個文件

public List<Record> ParseStream(Stream stream) { 
    var tfp = new TextFileParser(stream); 

    ... 
    try { 
     while (!tfp.EndOfData) { 
      records.Add(ParseRecord(tfp.ReadFields()); 
     } 
    } 
    catch (FormatException ex) { 
     ... // show error 
    } 
    catch (MalformadLineException ex) { 
     ... // show error 
    } 

    return records; 
} 

然後,我創建了一些方法驗證領域

public void ValidateField2(IEnumerable<Record> records) { 
    foreach (var invalidRecord in records.Where(x => x.Field2 < DateTime.Today)) 
     ... // show error 
} 

我曾嘗試過各種工具,但由於該圖案是直線前進,他們也沒有太大的幫助。 (你應該使用工具將線分裂成田)

相關問題