Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 1
Регистрация: 27.10.2015
Сообщений: 115
1

Удалить дубликаты строк из файла

09.02.2016, 19:58. Показов 3345. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть текстовый документ который состоит из строчек:
Номер, Ф.И.О, Адрес, и дата
Пример:
1, Faaliya.I.O, "Adres 15", "20.05.2000"
2, Kotok F.T, "Stret 20", "21.01.2000"
3, Faaliya.I.O, "Adres 15", "20.05.2000" \\ Эту строчку нужно удалить
я считываю данные с документа и вывожу их в мемо1, нужен кусочек кода который будет искать дублирующие строчки и удалит копии оставив только одну такую строчку и результат потом вывести в мемо2 в оконном виде.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2016, 19:58
Ответы с готовыми решениями:

Как из текстового файла удалить дубликаты строк и пробелы между строками?
Добрый день есть текстовый файл со строками ваниль ваниль яблоко яблоко виноград виноград...

Удалить дубликаты из массива строк
Есть массив arr = {"один","озеро","два","восемь","озеро","восемь","семь"} Нужно получить...

Удалить дубликаты строк в мемо
Как можно удалить дубликаты строк в мемо?

Как удалить дубликаты строк
Есть текстовый файл в нем есть дубликаты строк.

10
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
09.02.2016, 21:44 2
C++
1
2
3
4
5
6
7
8
for( int i( memo->Lines->Count - 1 ), dup_index; i >= 0; --i )
{   
    dup_index = memo->Lines->IndexOf( memo->Lines->Strings[i] );
    if( dup_index != i )
    {
        memo->Lines->Delete( i );
    }
}
Где-то так на память. Если список строк можно отсортировать, то все проще - есть TStringList и у него есть свойства Sorted и Duplicates, которые сделают то, что нужно.
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
09.02.2016, 21:50 3
Цитата Сообщение от BRcr Посмотреть сообщение
то все проще - есть TStringList и у него есть свойства Sorted и Duplicates, которые сделают то, что нужно
он тут не катит потому как строки абсолютно разные
1
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
09.02.2016, 22:29 4
Лучший ответ Сообщение было отмечено LaMeR55 как решение

Решение

Гм.. да, моя ошибка. Строки действительно частично отличаются.

Добавлено через 17 минут
Тогда где-то так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
std::auto_ptr<TStringList> line1( new TStringList( ) ), line2( new TStringList( ) );
line1->Delimiter = ',';
lene2->Delimiter = ',';
 
for( int i( memo->Lines->Count - 1 ), k; i > 0; --i )
{   
    line1->DelimitedText = memo->Lines->Strings[i];
    line1->Delete( 0 );
    
    for( k = 0; k < i; ++k )
    {
        line2->DelimitedText = memo->Lines->Strings[k];
        line2->Delete( 0 );
        if( line1->Text == line2->Text )
        {
            memo->Lines->Delete( i );
            break;
        }
    }
}
1
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
09.02.2016, 23:58 5
BRcr, от себя могу предложить такой вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Clear();
Memo2->Clear();
Memo1->Lines->LoadFromFile("F:\\12.txt");
Memo2->Text = Memo1->Text;
int k = 2,i;
i = Memo2->Perform(LB_FINDSTRING,k,Memo2->Lines->IndexOf(Memo2->Lines->Strings[k]));
do
{
 Memo2->Lines->Delete(i);
 i = Memo2->Perform(LB_FINDSTRING,k,Memo2->Lines->IndexOf(Memo2->Lines->Strings[k]));
}
while(i==k);
}
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
10.02.2016, 00:20 6
Sasha, разве этот алгоритм не ищет абсолютно одинаковые строки?
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
10.02.2016, 00:35 7
Ищет
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32991 / 21297 / 8180
Регистрация: 22.10.2011
Сообщений: 36,591
Записей в блоге: 8
10.02.2016, 00:43 8
А перегрузить для StringList-а метод CompareStrings так, чтобы он сравнивал только части строк после первой запятой, и потом просто IndexOf для поиска предыдущего вхождения строки - не проще будет?
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
10.02.2016, 00:49 9
Цитата Сообщение от volvo Посмотреть сообщение
А перегрузить для StringList-а метод CompareStrings так, чтобы он сравнивал только части строк после первой запятой, и потом просто IndexOf для поиска предыдущего вхождения строки - не проще будет?
volvo, продемонстрировать можешь?
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
10.02.2016, 00:54 10
volvo, естественно проще, но кому? Профессиональному программисту и ориентирующемуся на профессиональное программирование - да, таким людям подход покажется более эффективным. Мне он в голову не пришел.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32991 / 21297 / 8180
Регистрация: 22.10.2011
Сообщений: 36,591
Записей в блоге: 8
10.02.2016, 01:06 11
Лучший ответ Сообщение было отмечено Sasha как решение

Решение

Цитата Сообщение от Sasha Посмотреть сообщение
продемонстрировать можешь?
Чего бы нет?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
namespace My_StringList
{
    class TStringList : public System::Classes::TStringList
    {
    private:
        // это просто для удобства, можно и прямо в CompareStrings убрать все до первой запятой
        String RemoveID(const String s)
        {
            int p = s.Pos(",");
            return s.SubString(p + 1, s.Length() - p);
        }
 
    protected:
        virtual int __fastcall CompareStrings(const System::UnicodeString S1,
            const System::UnicodeString S2)
        {
            return AnsiCompareText(RemoveID(S1), RemoveID(S2));
        }
    };
 
};
 
void __fastcall TForm1::Button39Click(TObject *Sender)
{
    std::auto_ptr<My_StringList::TStringList>L (new My_StringList::TStringList());
 
    for (int i = 0; i < Memo1->Lines->Count; ++i)
    {
        String s = Memo1->Lines->Strings[i];
        if (L->IndexOf(s) == -1) L->Add(s);
    }
    Memo2->Lines->AddStrings(L.get());
}
0
10.02.2016, 01:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2016, 01:06
Помогаю со студенческими работами здесь

Как регулярками удалить дубликаты строк?
Всем привет, немогу никак сообразить как удалить дубли строки, или полностью всю строку, от 1...

Удалить дубликаты строк и символ из каждой строки
Добрый день. Помогите пожалуйста, есть текстовый файл состоящий из строк:...

Как из Таблице Paradox удалить дубликаты строк
Здравствуйте. Есть таблица Paradox в которой есть поле Num 1 1 2 3 3 Пожалуйста напишите...

Дубликаты удалить из файла
Есть файл nicks.txt В нем строки vasya petya vasy pety vova pety vova - ну вообщем такие повторы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru