我有一些 .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
}
我尝试过各种工具,但由于模式很简单,所以它们没有多大帮助。
(您应该使用工具将行拆分为字段)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)