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

  • Автор темы Автор темы diman
  • Дата начала Дата начала

diman

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

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
человеку нужен линк
 

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