我在用C#编写的if / else语句中遇到奇怪的行为。我是C#的新手,也是使用Visual Studio Pro 2017的ASP.NET的新手。
我正在努力为网络应用添加功能,以便通过用户每this article by Mudassar Khan
上传.CSV来上传SQL数据到表格一切都很好用。我现在正在努力在上传之前验证数据。我在上面的文章中使用相同的.CSV但是有一些"错误"条件介绍。
1,John,Hammond,United States
2,Shouldbreak,India
3,JohnMathews,Ireland
4,Robert,Schidner,Russia,sdfsdfdf,sdfsdfsdf,
在下面的代码中,您将看到我正在测试以确保每行中的列数正确,方法是在变量中设置所需的列数,并将其与每行中的逗号数进行比较在.CSV。
我希望的验证如下:
我还在一个单独的ASP控件中跟踪并显示每行中找到的逗号数,以便进行调试。
以下是我的代码隐藏文件中的代码:
//Upload and save the file
string csvPath = Server.MapPath("~/_uploadedDataCSV/") + Path.GetFileName(FileUpload1.PostedFile.FileName);
FileUpload1.SaveAs(csvPath);
DataTable dt = new DataTable();
int columnCount = 4; // Expected number of columns
int commas = 0; // Set comma count to 0;
int tableRow = 0; // set current table row to 0;
Count.Text = string.Empty;
string errMessage = string.Empty;
dt.Columns.AddRange(new DataColumn[4] // Add expected number of columns to table
{
// Add column Header and expected (c#)datatype
new DataColumn("Id", typeof(int)),
new DataColumn("First Name", typeof(string)),
new DataColumn("Last Name", typeof(string)),
new DataColumn("Country",typeof(string))
});
string csvData = File.ReadAllText(csvPath); // Creates String of all content in CSV file
foreach (string row in csvData.Split('\n')) // Do the following for each row in the file
{
// Start Validation Logic
// - - - - - - - - - - - - - - - - - - - -
tableRow++;
// Count commas in row
foreach (char ch in row)
{
if (ch.Equals(','))
{
commas++;
}
}
if (!string.IsNullOrEmpty(row)) // if the row is not empty
{
if (commas == columnCount) // if commas in row equals the number of columns expected
{
dt.Rows.Add();
int i = 0;
foreach (string cell in row.Split(','))
{
dt.Rows[dt.Rows.Count - 1][i] = cell;
i++;
}
}
//Begin error reporting for row
// - - - - - - - - - - - - - - - - - - - -
else if (commas != columnCount)
{
err.Visible = true; // show error message element
err.Text = errMessage; // set text of error message element to value of errMessage variable
if (commas >= columnCount) // if too many columns in row
{
errMessage+= $"Row {tableRow} has too many columns <br />";
}
else if (commas < columnCount) // if not enough columns in row
{
errMessage+= $"Row {tableRow} does not have enough columns <br />";
}
}
}
Count.Text+= commas.ToString() + "|";
commas = 0;
}
我遇到的问题是当一行中有太多列时,我没有收到与此情况相关的错误消息。调试控制器正确显示逗号的数量,如果太少,则正确显示消息,而不是消息太多。当我在调试器中单步调试代码时,会报告所有行的变量(逗号/ columnCount)已更正。
有什么建议吗?如果我遗漏了任何内容,我很乐意提供更多信息。
我尝试删除列太少的情况,但仍然没有显示太多列的消息。我也尝试颠倒检查的顺序,但给出了相同的输出。我已尝试按this discussion进行重建。
答案 0 :(得分:1)
所有学分应该归@Mike McCaughan所有,他的评论绝对到位。我只是想举一个迈克所说的例子:
string a = string.Empty;
string b = a;
a += "3";
Console.WriteLine(b); //result in empty string in console
回到你的问题:
string errMessage = string.Empty;
err.Text = errMessage;
errMessage+= $"Row {tableRow} has too many columns <br />";
Console.WriteLine(err.Text); //result in empty string in console
它发生的原因是因为c#中字符串的不可变性。表示对字符串对象的任何更改都将导致创建新对象。您可以在那里找到更多信息:Immutability of String Objects