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

时间:2013-05-17 12:00:27

标签: c# validation csv .net

我有一些.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#中做到这一点的好的设计,链接,模式,代码示例等?

4 个答案:

答案 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