3

我有一些 .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

4 回答 4

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
}

我尝试了各种工具,但由于模式很简单,它们并没有太大帮助。(您应该使用工具将行拆分为字段)

于 2013-05-17T12:23:36.187 回答
1

您可以使用FileHelpers一个免费/开源的 .Net 库来处理 CSV 和许多其他文件格式。

于 2013-05-17T12:17:04.297 回答
0

阿德里安姆和尼彭安巴斯塔

谢谢你回答我的问题。

我通过编写一个自己验证我的 .csv 文件的解决方案解决了我的问题。

使用adrianm 的代码很可能会产生更优雅的解决方案,但我没有这样做,但我鼓励看看adrianm 的代码。

我正在验证下面的列表。

  • 空文件 new FileInfo(dto.AbsoluteFileName).Length == 0

  • 文件行格式错误。string[] items = line.Split('\t'); 如果 (items.Count() == 20)

  • 行字段中的数据类型错误。整数;bool isNumber = int.TryParse(dataRow.ItemArray[0].ToString(), out number);

  • 缺少必填的行字段。if (dataRow.ItemArray[4].ToString().Length < 1)

为了处理 .csv 文件的内容,我的代码基于此代码示例:

http://bytes.com/topic/c-sharp/answers/256797-reading-tab-delimited-file

于 2013-05-30T14:01:10.893 回答
-1

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

我们一直在我们的项目中使用它,它非常强大并且按照它所说的去做。

于 2013-05-17T12:04:20.840 回答