如何在C#中存储之前validation.csv文件?

我有一些.csv文件,我在存储到数据库之前解析。

我想使应用程序更健壮,并在保存到数据库之前对.csv文件执行validation。

所以我问你们,如果你们有一些很好的链接,或代码示例,模式或建议如何做到这一点?

我将在下面粘贴我的.csv文件的示例。 .csv文件中的不同数据字段由制表符分隔。 每个新的数据行都在一个新行上。

我一直在思考我应该validation的内容,并提出了下面的列表(我非常愿意接受其他建议,以防你有什么想法应该添加到列表中?)

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 

上面的字符串表示forms如下:

 "4523424\tA123456\tGT-P1000\tmobile phone\tSamsung\tXSD1234\t135354191325234\r \n345353\tA134211\tA8181\tmobile phome\tHTC\tS4112-ad3\t111911911932343\r\n" 

那么你有没有关于如何在C#中做到这一点的好的设计,链接,模式,代码示例等?

我喜欢这个:

创建一个类来保存具有预期类型的​​每个已解析行

  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 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; } 

然后我创建了许多validation字段的方法

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

我尝试了各种工具,但由于模式很直接,所以没有多大帮助。 (您应该使用工具将行拆分为字段)

您可以使用FileHelpers免费/开源.Net库来处理CSV和许多其他文件格式。

你可能应该看看http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader

我们一直在我们的项目中使用它,它非常强大并且完成它所说的。

adrianm和Nipun Ambastha

感谢您对我的问题的回复。

我通过编写一个自己validation我的.csv文件的解决方案解决了我的问题。

使用adrianm的代码很可能会有一个更优雅的解决方案,但我没有这样做,但我很乐意给adrianm的代码一个表情。

我正在validation下面的列表。

  • 空文件新FileInfo(dto.AbsoluteFileName).Length == 0

  • 文件行的格式错误。 string [] items = line.Split(’\ t’); if(items.Count()== 20)

  • 行字段中的数据类型错误。 int数; bool isNumber = int.TryParse(dataRow.ItemArray [0] .ToString(),out number);

  • 缺少必填的行字段。 if(dataRow.ItemArray [4] .ToString()。Length <1)

要完成.csv文件的内容,我将基于此代码示例的代码:

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