【发布时间】:2012-09-17 20:17:00
【问题描述】:
我有一些代码可以读取 CSV 文件的每一行,如果该值与正确的值不匹配,它会将其添加到返回到用户屏幕的错误列表中。我遇到的问题是正则表达式本身。
protected void ReadData(string filePath, bool upload)
{
StringBuilder sb = new StringBuilder();
#region upload
if (upload == true) // CSV file upload chosen
{
using (CsvReader csv = new CsvReader(new StreamReader(filePath), true)) // Cache CSV file to memory
{
int fieldCount = csv.FieldCount; // Total number of fields per row
string[] headers = csv.GetFieldHeaders(); // Correct CSV headers stored in array
SortedList<int, string> errorList = new SortedList<int, string>(); // This list will contain error values
bool errorFlag = false;
int errorCount = 0;
// Check if headers are correct first before reading data
if (headers[0] != "first name" || headers[1] != "last name" || headers[2] != "job title" || headers[3] != "email address" || headers[4] != "telephone number" || headers[5] != "company" || headers[6] != "research manager" || headers[7] != "user card number")
{
sb.Append("Headers are incorrect");
}
else
{
while (csv.ReadNextRecord())
try
{
//Check csv obj data for valid values
for (int i = 0; i < fieldCount; i++)
{
if (i == 0 || i == 1) // FirstName and LastName
{
if (Regex.IsMatch(csv[i].ToString(), "[a-zA-Z]", RegexOptions.IgnoreCase)) //REGEX letters only min of 5 char max of 20
{
errorList.Add(errorCount, csv[i]);
errorCount += 1;
errorFlag = true;
string text = csv[i].ToString();
}
}
else if (i == 5) // Company name
{
string text = csv[i];
text.Replace("&", "and");
}
}
if (errorFlag == true)
{
sb.Append("<b>" + "Number of Error: " + errorCount + "</b>");
sb.Append("<ul>");
foreach (KeyValuePair<int, string> key in errorList)
{
sb.Append("<li>" + key.Value + "</li>");
}
}
else // All validation checks equaled to false. Create User
{
ORCLdap.CreateUserAccount(rootLDAPPath, svcUsername, svcPassword, csv[0], csv[1], csv[2], csv[3], csv[4], csv[5], csv[7]);
sb.Append("<b>New user data uploaded successfully</b>");
}
}// end of try
catch (Exception ex)
{
sb.Append(ex.ToString());
}
finally
{
lblMessage.Text = sb.ToString();
sb.Remove(0, sb.Length);
}
}
}
#endregion
lblMessage.text 包含这个 html:
错误数:4
- 大卫1212
- 史密斯
- 尼克444
- 高迪333
什么时候应该是 3 个错误,因为 smith 不包含数字。
有人对此有什么建议吗?
【问题讨论】:
-
你能把它分解成你想用正则表达式匹配的吗?您当前正在使用的正则表达式,以及您当前得到的结果 - 我认为这里的其余过程确实使原本简单的问题变得模糊不清。
-
当然。名字和姓氏可以包含字母,但不能包含数字。 I == 0 是字段行名字,i == 1 是字段行姓氏。我认为我的正则表达式字符串对于匹配仅是字母的值是正确的。基本上,如果字符串中有数字,则添加到错误列表集合中。