我有一些.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#中做到这一点的好的设计,链接,模式,代码示例等?
答案 0 :(得分: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
}
我尝试了各种工具,但由于模式很直接,所以没有多大帮助。 (您应该使用工具将行拆分为字段)
答案 1 :(得分:1)
您可以使用FileHelpers免费/开源.Net库来处理CSV和许多其他文件格式。
答案 2 :(得分:-1)
大概你应该看看 http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader
我们一直在我们的项目中使用它,它非常强大并且完成它所说的。
答案 3 :(得分:-2)
adrianm和Nipun Ambastha
感谢您对我的问题的回复。
我通过编写一个自己验证我的.csv文件的解决方案解决了我的问题。
很有可能通过使用adrianm的代码可以获得更优雅的解决方案,但我没有这样做,但我鼓励给adrianm的代码一看。
我正在验证以下列表。
空文件 new 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&lt; 1)
要完成.csv文件的内容,我的代码基于此代码示例:
http://bytes.com/topic/c-sharp/answers/256797-reading-tab-delimited-file