我创建了一个读取当前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/