我正在上传csv文件并将数据保存到数据库中。我已经完成了保存部分,但我需要的是用正确的数据farmat验证csv。
-----------------------------------------------
Name Address Age Gender
---------------------------------------------
a Hyderabad 23 M
b Banglore 25 F
c Mumbai 26 M
---------------------------------------------
上传时,csv文件中的数据需要采用上述格式。如果他们以下面的格式输入数据并尝试上传,则需要显示错误消息“上传有效的CSV文件”。
-----------------------------------------------
Name Address (Column Name Is missing) Gender| Column0
--------------------------------------------
a Hyderabad 23 M ( Some Junk Data)
b Banglore 25 F |
c Mumbai 26 M |
---------------------------------------------
--------------------------------------------
Xyz olp
-------------------------------------------
我搜索了很多,但没有找到适合我问题的有效链接。
答案 0 :(得分:2)
这不会是一个神奇的子弹。通过设计CSV,如果相当流畅,那么你将无法像xml文件一样验证它。
但你可以做一些事情,例如:
public void ValidateCsv(string fileContents)
{
var fileLines = fileContents.Split(
new string[] { "\r\n", "\n" }, StringSplitOptions.None);
if (fileLines.Count < 2)
//fail - no data row.
ValidateColumnHeader(fileLines[0]);
ValidateRows(fileLines.Skip(1));
}
public bool ValidateColumnHeaders(string header)
{
return header.Trim().Replace(' ','').ToLower() ==
"name,address,age,gender";
}
public bool ValidateRows(IEnumerable<string> rows)
{
foreach(row in rows)
{
var cells = row.Split(',');
//check if the number of cells is correct
if (!cells.Length == 4)
return false;
//ensure gender is correct
if (cells[3] != "M" && cells[3] != "F")
return false;
//perform any additional row checks relevant to your domain
}
}
大多数验证都是针对您的业务领域的,因此您需要自己决定什么是“坏数据”。例如,您可以检查Age
列是否为正数。
答案 1 :(得分:2)
使用正则表达式。如果csv文件中的每一行都有一个特定的模板,我认为正则表达式是最好的解决方案。这是一个例子:
Template: 12345[tab]String(20 chars)[tab]String(1 char an one of these: M,N,O)
Regex: ^[0-9]{1,5}(\ ){0,4}\t.{20}\t[MNO]$
Lines:
12345 abcdefg M --->Match
54345 abcdefg ghft O --->Match
12 vfjnvfjn vfjnvfn K --->No Match because it is faulty
12 vfjnvfjn vfjnvfn N --->Match
答案 2 :(得分:0)
我会建议使用CsvHelper,它是一个很棒的CSV库,有一些方法可以处理格式错误的CSV,这里是:https://github.com/JoshClose/CsvHelper
查看文档:
http://joshclose.github.io/CsvHelper/
有一个例子说明如何在CSV格式化时读取文件并执行某些操作:
var csv = new CsvReader( textReader );
while( csv.Read() )
{
int intField;
if( !csv.TryGetField( 0, out intField ) )
{
// Do something when it can't convert.
}
}
请务必查看上面链接上的文档,可以选择忽略读取异常:
csv.Configuration.IgnoreReadingExceptions = true;