Проверьте определенный столбец в данных файла CSV, используя textfieldparser в c# - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть кнопка в моей веб-форме, которая загружает CSV-файл с данными, вставляет данные в базу данных и отображает содержимое базы данных в виде таблицы. Я использую TextFieldParser для чтения файла CSV. Однако я не могу понять, как добавить в него проверку.

Я хочу проверить первый столбец (это SKU в моей базе данных) загруженных данных файла CSV. Если данные имеют дубликат в базе данных, появится сообщение о невозможности завершения действия. Если нет, он продолжит вставлять данные в базу данных.
Вот как выглядят данные в загружаемом CSV-файле

Для справки. Это мой код:

protected void AddButton_Click(object sender, EventArgs e)
    {

        string path = @"C:\Users\hac9289\Downloads\";
        //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);

    }

Есть идеи? Любая помощь будет оценена. Спасибо.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Вы можете использовать метод 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
     }
0 голосов
/ 20 февраля 2020

Как это,

 ...

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++;
}

...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...