我创建了一个读取当前csv文件大小为20-30 mb的大型csv文件的解决方案,我尝试根据用户在运行时选择的某些列值,使用查找重复行的常用技术删除重复行,但是缓慢,似乎该程序根本无法正常工作。

可以使用什么其他方法来从csv文件中删除重复的记录

这是代码,绝对是我做错了

DataTable dtCSV = ReadCsv(文件,列);
//columns是一个字符串列表List的列表
DataTable dt = RemoveDuplicateRecords(dtCSV,列);

私有(private)DataTable RemoveDuplicateRecords(DataTable dtCSV,List 列)
{
DataView dv = dtCSV.DefaultView;
字符串RowFilter = string.Empty;

如果(dt == null)
dt = dv.ToTable()。Clone();

DataRow行= dtCSV.Rows [0];
foreach(dtCSV.Rows中的DataRow行)
{
尝试
{
RowFilter = string.Empty;

foreach(列中的字符串列)
{
字符串col =列;
RowFilter + =“[” + col +“]” +“='” + row [col] .ToString()。Replace(“'”,“”“)+”'和“;
}
RowFilter = RowFilter.Substring(0,RowFilter.Length-4);
dv.RowFilter = RowFilter;
DataRow dr = dt.NewRow();
bool结果= RowExists(dt,RowFilter);
如果(!结果)
{
dr.ItemArray = dv.ToTable()。Rows [0] .ItemArray;
dt.Rows.Add(dr);

}

}
捕获(前异常(exception))
{
}
}
返回dt
}

最佳答案

一种方法是遍历表,构建一个HashSet<string>,其中包含您感兴趣的组合列值。如果尝试添加已经存在的字符串,那么您将有重复的行。就像是:

HashSet<string> ScannedRecords = new HashSet<string>();

foreach (var row in dtCSV.Rows)
{
    // Build a string that contains the combined column values
    StringBuilder sb = new StringBuilder();
    foreach (string col in columns)
    {
        sb.AppendFormat("[{0}={1}]", col, row[col].ToString());
    }

    // Try to add the string to the HashSet.
    // If Add returns false, then there is a prior record with the same values
    if (!ScannedRecords.Add(sb.ToString())
    {
        // This record is a duplicate.
    }
}

那应该很快。

关于c# - 从大型csv文件C#.Net删除重复记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5272500/

10-11 15:20