如何在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#中做到这一点吗?

如何在c#中存储.csv文件之前验证

我这样做:

创建一个类来保存每个具有预期类型

的已解析行
 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)

为了处理。csv文件的内容,我基于以下代码示例编写了代码: http://bytes.com/topic/c-sharp/answers/256797-reading-tab-delimited-file

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

我们已经在我们的项目中使用了这个,它非常健壮,而且它说什么就做什么。