我有一个网页,用于向服务器提交CSV文件。我必须验证文件,例如正确的列数,正确的数据类型,交叉字段验证,数据范围验证等。最后要么显示成功的消息,要么返回带有错误消息和行号的CSV。
目前,每个行和每个列都会循环查找CSV文件中的所有错误。但是对于较大的文件来说它变得非常慢,有时会导致服务器超时。有人可以建议一个更好的方法来做到这一点。
由于
答案 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