Удаление дублей.

diman

Client
Регистрация
18.02.2018
Сообщения
98
Благодарностей
15
Баллы
8
Кто знает, как можно удалить дубли из текста, если помимо самих дублей - в строке еще есть текст.
Например из таких строк:
12345 456456
12345 654468
53456 356554
Первые 2 должны считаться дублями и одну из них (любую) нужно удалить
Все строки лежат в списке либо в файле .txt. Раньше делал через таблицу - удалить дубли по 1 столбцу,
но сейчас кол-во строк более млн. поэтому через таблицу не вариант.
Может кто-нибудь посоветовать, как это реализовать?
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 041
Баллы
113
это не дубли, бери первое значение и проверяй и по нему удаляй что нашлось
 

diman

Client
Регистрация
18.02.2018
Сообщения
98
Благодарностей
15
Баллы
8
Я понимаю, что это не дубли, но удалить мне их все равно нужно. Проверять по 1 строке не вариант, т.к строк слишком много
 

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
63
Есть сниппет, который делает из похожих предложений спинтакс. Он далек от совершенство, но с простыми предложениями справляется.

C#:
var list1 = project.Lists["Список"];//список, где лежат предложения
var list2 = project.Lists["Список2"];//список для результата
List <string> spintax = new List <string>();//временный список
/*----------------------------------------------------------------------------------------------------------------------*/
char[] array1;//массив символов для предложения, с которым сравниваем другие предложения
char[] array2;//массив символов для предложения, которое будет сравнивать
/*----------------------------------------------------------------------------------------------------------------------*/
string result1 = "";//промежуточная переменные для записи первого словесного совпадения
string result2 = "";//промежуточная переменные для конца предложения
/*----------------------------------------------------------------------------------------------------------------------*/
bool start = false;//логическая переменная для проверки было уже совпадение или нет
/*----------------------------------------------------------------------------------------------------------------------*/
int i = 0, j = i + 1, k = 0, l = 0;//счетчики для циклов
/*----------------------------------------------------------------------------------------------------------------------*/
int count = list1.Count;//количество строк в списке с предложениями
/*----------------------------------------------------------------------------------------------------------------------*/
//Цикл для поиска спинтакса. Берется строка из списка по порядку за основу и сверяется с следующими строками для на схожесть
for (i = 0; i < count; i++){
    result1 = "";
    array1 = list1[i].ToCharArray();
    /*----------------------------------------------------------------------------------------------------------------------*/
    //Цикл для поиска по списку совпадений. Берем слудющие строки по порядку и сверям с "основной" строкой
    for (j = i + 1; j < count; j++){
        /*----------------------------------------------------------------------------------------------------------------------*/
        //если строка последняя и у нее нет совпадений, то просто заносим ее в итоговый список как есть
        try{
            /*----------------------------------------------------------------------------------------------------------------------*/
            //если два предложения одинаковы, то удаляем последнее
            while (list1[i] == list1[j]){
                list1.RemoveAt(j);
            }
            /*----------------------------------------------------------------------------------------------------------------------*/
            array2 = list1[j].ToCharArray();
        }
        catch{
            break;
        }
        /*----------------------------------------------------------------------------------------------------------------------*/
        //ищем совпадения до тех пор, пока символы не будут разными, а также записываем начало предложений первый раз
        if (result1 == ""){
            try{
                for (k = 0;; k++){
                    if (array1[k] != array2[k]){
                        break;
                    }
                    result1 += array1[k].ToString();
                }
            }
            catch{
                result2 = "";
                continue;
            }
        }
        /*----------------------------------------------------------------------------------------------------------------------*/
        //ищем совпадения до тех пор, пока символы не будут разными все последующие разы
        else{
            array1 = result1.ToCharArray();
            try{
                for (k = 0; k < array1.Length; k++){
                    if (array1[k] != array2[k]){
                        start = true;
                        break;
                    }
                }
            }
            catch{
                result2 = "";
                continue;
            }
        }
        /*----------------------------------------------------------------------------------------------------------------------*/
        //если нет совпадения, то двигаемся к следуюущей строке
        if (result1 == "" || start){
            start = false;
            continue;
        }
        /*----------------------------------------------------------------------------------------------------------------------*/
        //в другом случае запоминаем конец предложений
        else{
            /*----------------------------------------------------------------------------------------------------------------------*/
            //если не было еще совпадений, то записываем второую часть основного предложения во вторую переменную
            if (spintax.Count == 0){
                for (l = k; l < array1.Length; l++){
                    result2 += array1[l].ToString();
                }
                spintax.Add(result2);
                result2 = "";
            }
            /*----------------------------------------------------------------------------------------------------------------------*/
            //цикл для второго предложения
            for (l = k; l < array2.Length; l++){
                result2 += array2[l].ToString();//дописываем вторую часть предложения
            }
            spintax.Add(result2);
            result2 = "";
            /*----------------------------------------------------------------------------------------------------------------------*/
            //удаляем строку, которая совпала
            list1.RemoveAt(j);
            j--;
        }
        /*----------------------------------------------------------------------------------------------------------------------*/
        //обновляем количество строк в списке
        count = list1.Count;
    }
    /*----------------------------------------------------------------------------------------------------------------------*/
    //добавляем в итоговый список готовый спинтакс
    if (spintax.Count != 0){
        list2.Add(result1 + "{" + String.Join("|", spintax.ToArray()) + "}");
    }
    /*----------------------------------------------------------------------------------------------------------------------*/
    //если не нашло совпадений, то записываем строку как есть
    else{
        list2.Add(list1[i]);
    }
    /*----------------------------------------------------------------------------------------------------------------------*/
    //очищаем список совпадений
    spintax.Clear();
    /*----------------------------------------------------------------------------------------------------------------------*/
    //обновляем количество строк в списке
    count = list1.Count;
}
Пример:
2.png

Может получится его под себя переделать.
 
Последнее редактирование:
  • Спасибо
Реакции: kompas777 и diman

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
63
Допишу:
В изначальном списке удаляются все "похожие" дубли, так что я думаю это может послужить вам решением.
 
  • Спасибо
Реакции: diman

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 041
Баллы
113
человеку нужен линк
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 041
Баллы
113

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)