验证CSV文件

时间:2011-01-21 04:57:18

标签: c# csv

我有一个网页,用于向服务器提交CSV文件。我必须验证文件,例如正确的列数,正确的数据类型,交叉字段验证,数据范围验证等。最后要么显示成功的消息,要么返回带有错误消息和行号的CSV。

目前,每个行和每个列都会循环查找CSV文件中的所有错误。但是对于较大的文件来说它变得非常慢,有时会导致服务器超时。有人可以建议一个更好的方法来做到这一点。

由于

5 个答案:

答案 0 :(得分:2)

要验证CSV文件,您肯定需要检查每列。如果可能,在您的方案中唯一最好的方法是在附加到CSV文件时验证条目本身..


修改

由@accolaum指出错误,我编辑了我的代码

It will only work provided each row is delimited with a `\n`

如果您只想验证列的数量..则更容易..只需使用列数的所有条目的mod

bool file_isvalid;
string data = streamreader.ReadLine();
while(data != null)
{
    if(data.Split(',').Length % Num_Of_Columns == 0)
    {
        file_isvalid = true;
        //Perform opertaion
    }
    else
    {
        file_isvalid = false;
        //Perform Operation
    }
    data = streamreader.ReadLine();
}

希望有所帮助

答案 1 :(得分:1)

您可以优化代码以更快地执行,但您真正想要做的是生成一个工作线程来进行处理。

这个的两个好处

  • 您可以将用户重定向到其他页面,以便他们知道他们的请求已提交
  • 可以为工作线程提供回调,以便它可以报告其状态 - 如果您愿意,可以在'提交'页面上放置进度条或百分比,以便用户可以看到他们的文件正在处理。

让用户等待长时间运行的进程完成是不好的设计 - 他们应该获得更新或通知,而不仅仅是浏览器上的“加载”图标。

编辑:这是我的答案,因为(1)我不建议在不看代码的情况下改进代码,(2)效率提升可能只会产生渐进式改进(除非你做了一些非常错误的事情),不会长期解决你的问题。

答案 2 :(得分:1)

我建议采用基于规则的方法,类似于单元测试。想想每一个!可能出现的错误,并在提高抽象级别时对它们进行排序

  • 正确的文件编码
  • 正确的行数/列数
  • 正确的列标题
  • 正确的数字/文字/日期格式
  • 正确的数字范围
  • 商业规则??
  • ...

这些规则也可以自动修复。因此,如果您可以自动检测编码,则可以在测试所有规则之前对其进行更正。

可以使用命令模式

完成实现
public abstract class RuleBase
{
  public abstract bool Test();
  public virtual bool CanCorrect()
  { 
     return false;
  }
}

然后为要进行的每个测试创建一个子类,并将它们放在一个列表中。

使用后台线程仅测试传入文件可以克服超时。用户必须等到他的文件被验证并变为“活动”。完成后,您可以将他转到下一页。

答案 3 :(得分:0)

csv数据的验证通常需要查看每个单元格。你可以发布一些代码,可能有办法优化它。

修改

在大多数情况下,这是最佳解决方案

foreach(row) {
    foreach (column) {
        validate cell
    }
}

如果你真的很热衷,你可以尝试使用正则表达式

foreach(row) {
    validate row by regex
}

但是你真的只是将验证码加载到正则表达式,我真的很讨厌使用正则表达式

答案 4 :(得分:0)

您可以使用XMLReader并解析XSD