【问题标题】:Insert only the duplicate records from csv in to the Database仅将 csv 中的重复记录插入到数据库中
【发布时间】:2017-07-29 10:55:12
【问题描述】:

我正在努力在将 csv 插入数据库之前对其进行验证。我已经完成了将它们插入数据库的工作,但不确定如何验证重复记录并仅将重复记录插入数据库。CSV 如下所示,我们可以在 CSV 中将 ProdID 作为重复项接收

ProdID,Name,Color,Availability
P01,Product1,Red,Yes
P02,Product2,Blue,Yes
P03,Product3,Yellow,No
P01,Product4,Red,Yes
P04,Product5,Black,Yes

该表有五个字段,其中一个字段是重复字段

class Products
{
    static void Main(string[] args)
    {
        string location = "\Products.csv";
        List<Products> ProductsList= ReadInCSV(location);
        var connStr = ConfigurationManager.ConnectionStrings["ProgConnectionString"].ConnectionString;

        // Need to validate them before putting them in to the table 

        string sqlString = "INSERT INTO PRODUCTS (ProdID,Name,Color,Availability,Duplicate) VALUES (@ProdID,@Name,@Color,@Availability,@Duplicate );";
        for (int i = 0; i < ProductsList.Count; i++)
        {
            using (MySqlConnection conn = new MySqlConnection(connStr))
            using (MySqlCommand comm = new MySqlCommand(sqlString, conn))
            {
                comm.Parameters.Add("@ProdID", MySqlDbType.VarChar).Value = ProductsList[i].ProdID;
                comm.Parameters.Add("@Name", MySqlDbType.VarChar).Value = ProductsList[i].Name;
                comm.Parameters.Add("@Color", MySqlDbType.VarChar).Value = ProductsList[i].Color;
                comm.Parameters.Add("@Availability", MySqlDbType.VarChar).Value = ProductsList[i].Availability;
                comm.Parameters.Add("@Duplicate", MySqlDbType.VarChar).Value = "Yes";
                conn.Open();
                comm.ExecuteNonQuery();
                conn.Close();
            }
        }
    }
}

我不确定如何检查 csv 中的重复记录并只插入重复的记录。

【问题讨论】:

  • 我不清楚你在问什么?您是否只想插入不同的记录(即排除重复记录)?还是您只想插入重复的记录(如果是这样,您是想要重复的所有副本还是只需要代表重复的单个实例)?
  • 哪些是“csv中的重复记录”?在我看来,它们都不同。
  • @maccettura 我只需要插入重复的记录。这里 P01 正在重复,我只需要将这两条记录插入到表中
  • @DourHighArch 只需要查找 ProdID 并在重复时插入数据库

标签: c# mysql database csv


【解决方案1】:

根据您的评论,您只想插入两条重复的记录。在你的例子中p01

这可以通过一个简单的 LINQ 查询来解决:

ProductsList.GroupBy(p => p.ProdID).Where(p => p.Count() > 1).SelectMany(x => x);

这将根据它们各自的ProdID 对项目进行分组,然后我们只选择该组包含多个实例的实例。

用它代替你的 for 循环:

foreach(var prod in ProductsList.GroupBy(p => p.ProdID).Where(p => p.Count() > 1).SelectMany(x => x))
{
    using (MySqlConnection conn = new MySqlConnection(connStr))
    using (MySqlCommand comm = new MySqlCommand(sqlString, conn))
    {
        comm.Parameters.Add("@ProdID", MySqlDbType.VarChar).Value = prod.ProdID;
        comm.Parameters.Add("@Name", MySqlDbType.VarChar).Value = prod.Name;
        comm.Parameters.Add("@Color", MySqlDbType.VarChar).Value = prod.Color;
        comm.Parameters.Add("@Availability", MySqlDbType.VarChar).Value = prod.Availability;
        comm.Parameters.Add("@Duplicate", MySqlDbType.VarChar).Value = "Yes";
        conn.Open();
        comm.ExecuteNonQuery();
        conn.Close();
    }
}

我创建了一个fiddle 来演示

【讨论】:

  • 谢谢。但是我在prod.ProdID'bool' does not contain a definition for 'ProdID' and no extension method 'ProdID' accepting a first argument of type 'bool' could be found (are you missing a using directive or an assembly reference?) 时遇到错误我应该使用 ProductsList[i].ProdID;而是
  • 我用一个有效的小提琴更新了我的答案,我的原始代码不正确
  • 非常感谢。完美运行
【解决方案2】:

我认为您可以在查询中添加“@duplicate like 'yes'”。

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 2020-11-28
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2023-04-08
    相关资源
    最近更新 更多