Здравствуйте. Перелазил все форумы, наткнулся на ваш. Надеюсь тут найти решение. Есть таблица 1 миллион строк. В ней 3 столбца Имя-Номер-Город. Каждый день парсю по 100к новых номеров. Как мне осуществить проверку новой таблицы с уже существующей базой на дубликаты. Может есть уже готовый софт или кто в состоянии написать С# код. Моих знаний хватило только зациклить последовательую проверку строк, как вы уже понимаете это сильно грузит ЦП и занимает много времени.
Я вот как пытался решить эту задачку: Этим кодом я в обеих таблицах вытащил по колонке с номерами Code: IZennoTable table = project.Tables["на проверку"]; //указываем таблицу IZennoList list = project.Lists["новые"]; //указываем список string column = "B"; //указываем наименование столбца string cell; //Перегоняем столбец в список for (int i=0;i<table.RowCount; i++){ cell = table.GetCell(column, i);// list.Add(cell); } Этим кодом я почистил номера от дублей Code: lock(SyncObjects.ListSyncer){ string[] first = File.ReadAllLines(@"D:\база.txt"); string[] second = File.ReadAllLines(@"D:\новые.txt"); string[] third = second.AsParallel().Except(first.AsParallel()).ToArray(); File.WriteAllLines(@"D:\новые.txt", third); } Этим я искал номер строки с с телефоном, чтобы потом по номеру строки вытянуть соседни ячейки(имя, адрес). Ну и дальше подставлял в табличку по строчно, естественно зациклив это дело. Именно этот участок сильно грузит ЦП, если делать больше чем в 15 потоков, ну и занимает ооочень много времени. Можно ли как-то применить AsParallel сюда. Ну или вообще я не правильным путем пошел, сложная для меня задачка. Code: // берем из переменной текст, который надо искать var textContains = project.Variables["phone"].Value; // получаем таблицу, в которой будем искать var sourceTable = project.Tables["на проверку"]; // ищем в каждой строчке в таблице lock(SyncObjects.TableSyncer) { for(int i=0; i < sourceTable.RowCount; i++) { // читаем строку из таблицы (это будет массив ячеек) var cells = sourceTable.GetRow(i).ToArray(); // пройдем в цикле по всем ячейкам for (int j=0; j < cells.Length; j++) { // проверяем содержание текста в ячейке, если есть совпадение возвращаем "yes" if (cells[j].Contains(textContains)) return i; } } } // если ничего не нашли возвращаем "no" return "54321";
1) где хранишь все данные? не грузи их все в память. это ни к чему. загоняй все данные в БД. что бы проще - MS SQL. 2) через ADO или еще лучше EF просто чекни на .Any() или .FirstOrDefault()
Делать это на уровне прикладухи идиотизм: 2 варианта) Code: SELECT DISTINCT * FROM NewTable N LEFT JOIN OldTable O ON N.Number = O.Number WHERE O.NUMBER = NULL SELECT DISTINCT Fio, Number, City FROM NewTable WHERE Number NOT IN ( SELECT Number FROM OldTable)