如何在c#中存储.csv文件之前验证
本文关键字:文件 验证 csv 存储 | 更新日期: 2023-09-27 18:14:18
我有一些。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#中做到这一点吗?
我这样做:
创建一个类来保存每个具有预期类型
的已解析行 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
}
我尝试了各种工具,但由于模式是直接的,他们没有多大帮助。(您应该使用工具将行分割成多个字段)
您可以使用FileHelpers(一个免费/开源的。net库)来处理CSV和许多其他文件格式。
adrianm and Nipun Ambastha
谢谢你对我问题的回答。
我通过编写一个解决方案来验证我的。csv文件来解决我的问题。
很可能通过使用adrianm的代码可以得到一个更优雅的解决方案,但是我没有这样做,但是我鼓励大家看看adrianm的代码。
我正在验证下面的列表。
-
空文件新FileInfo (dto.AbsoluteFileName)。长度== 0
-
文件行格式错误。string[] items = line.Split(''t');if (items.Count() == 20)
-
行字段数据类型错误。int数;bool isNumber = int.TryParse(dataRow.ItemArray[0].ToString(), out number);
-
缺少必需的行字段。如果(dataRow.ItemArray [4] .ToString()。长度& lt;1)
也许你应该看看http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader
我们已经在我们的项目中使用了这个,它非常健壮,而且它说什么就做什么。