使用c#中的textfieldparser验证csv文件数据中的某一列



我的网络表单中有一个按钮,它可以上传带有数据的csv文件,将数据插入数据库,并在网格视图中显示数据库的内容。我正在使用TextFieldParser读取csv文件。然而,我似乎不知道如何在其中添加验证

我想验证上传的csv文件数据的第一列(即我数据库中的SKU(。如果数据在数据库中有重复项,则会提示无法完成操作的消息。如果没有,它将继续在数据库中插入数据
这就是将要上传的csv文件中的数据看起来像的样子

供参考,这是我的代码:

protected void AddButton_Click(object sender, EventArgs e)
{
string path = @"C:Usershac9289Downloads";
//Creating object of datatable  
DataTable tblcsv = new DataTable();
//creating columns
tblcsv.Columns.Add("Stock Keeping Unit");
tblcsv.Columns.Add("Universal Product Code");
tblcsv.Columns.Add("Vendor Name");
tblcsv.Columns.Add("Product Name");
tblcsv.Columns.Add("Product Description");
tblcsv.Columns.Add("Retail Price");
//getting full file path of Uploaded file  
string CSVFilePath = Path.GetFullPath(path + AddFile.PostedFile.FileName);
if (!AddFile.HasFile)
{
ScriptManager.RegisterStartupScript(this, typeof(string), "Alert", "alert('File Upload Empty');", true);
}
else
{
//parse records in csv file
using (TextFieldParser parser = new TextFieldParser(CSVFilePath))
{
parser.HasFieldsEnclosedInQuotes = true;
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
bool invalid = false;
while (!parser.EndOfData)
{
//Processing row
tblcsv.Rows.Add();
int count = 0;
string[] fields = parser.ReadFields();
/*I am trying these code for validation but it doesnt work hahaha
foreach (DataRow row in tblcsv.Rows)
{
// Check some other column is not equal to some value
if (row["StockKeepingUnit"] == fields)
{
ScriptManager.RegisterStartupScript(this, typeof(string), "Alert", "alert('Action not completed due to duplicate SKU');", true);
}
}*/
foreach (string field in fields)
{
tblcsv.Rows[tblcsv.Rows.Count - 1][count] = field;
count++;
}
}
}
InsertCSVRecords(tblcsv);
PopulateGridView();
}
}
private void InsertCSVRecords(DataTable csvdt)
{
using (SqlConnection connect = new SqlConnection(connectionString))
{
connect.Open();
//creating object of SqlBulkCopy
using (SqlBulkCopy objbulk = new SqlBulkCopy(connect))
{
//assigning Destination table name    
objbulk.DestinationTableName = "RetailInfo";
//Mapping Table column
objbulk.ColumnMappings.Add(0, "StockKeepingUnit");
objbulk.ColumnMappings.Add(1, "UniversalProductCode");
objbulk.ColumnMappings.Add(2, "VendorName");
objbulk.ColumnMappings.Add(3, "ProductName");
objbulk.ColumnMappings.Add(4, "ProductDesc");
objbulk.ColumnMappings.Add(5, "RetailPrice");
//inserting Datatable Records to DataBase    
objbulk.WriteToServer(csvdt);
}
}
ScriptManager.RegisterStartupScript(this, typeof(string), "Alert", "alert('CSV Data added');", true);
}

有什么想法吗?任何帮助都将不胜感激。非常感谢。

像这样,

...
foreach (string field in fields)
{
// Just here your fields populating in tblcsv's rows. You can check here your field is existing or not.
// [your_code] : checks field type (or something else) is SKU, after check if exist.
tblcsv.Rows[tblcsv.Rows.Count - 1][count] = field;
count++;
}
...

您可以使用数据表的select方法,该方法返回与筛选条件匹配的行数组。

//Instead of 0 in fileds[0] you have to provide an index of stock-keeping unit index position in array
if (tblcsv.Select($"StockKeepingUnit={fields[0]}").Length > 0)
{
//Display Message Record already exists
//Skip to add in datatable and continue
//or display message
}

最新更新