Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Работа с файлом, удаление повторных строк Добавлено: 11.02.03 09:24  

Автор вопроса:  Mystforse | Web-сайт: visualprogs.narod.ru
 

Люди есть текстовый файл, в котором по одному слову на строчке,

Как провести сравнение, например, если строка уже есть, то такую же вычеркнуть

mailto:visualprogs@narod.ru

Ответить

  Ответы Всего ответов: 5  

Номер ответа: 1
Автор ответа:
 DimaS



Вопросов: 2
Ответов: 85
 Профиль | | #1 Добавлено: 11.02.03 11:26

Может есть возможность использования для хранения данных не файл, а базу данных, тогда все просто - запрос на поиск повторяющихся значений. Если нет такой возможности, то на вскидку:

- считываешь файл в массив;

- Начинаешь проверку строк функцией StrComp, что-то вроде:

    For i = 0 To UBound(MyArr)
        For j = i + 1 To UBound(MyArr)
            If StrComp(MyArr(i), MyArr(j)) = 0 Then MyArr(j) =""
        Next j
    Next i

-Перезаписываешь файл из массива, по условию MyArr(i)<>"";

 

Удачи.

Ответить

Номер ответа: 2
Автор ответа:
 AlexSid



Вопросов: 4
Ответов: 27
 Профиль | | #2 Добавлено: 11.02.03 12:41

Сложность получается n^2. Может попробовать отсортировать массив (как-нибудь побыстрее), а потом добавлять в файл по очереди, если текущая запись не равна предыдущей?

Вообще, имеет ли значение порядок строк в файле? А большые файлы?

Ответить

Номер ответа: 3
Автор ответа:
 DimaS



Вопросов: 2
Ответов: 85
 Профиль | | #3 Добавлено: 11.02.03 13:44

To AlexSid: Сортировка и последующие сравнение займет больше времени, чем предложенный алгоритм.

Ответить

Номер ответа: 4
Автор ответа:
 Goul



Вопросов: 0
Ответов: 29
 Профиль | | #4 Добавлено: 11.02.03 15:11

Второй вариант зависит от алгоритма сортировки и, по-моему, вполне способен конкурировать с первым.

Например, можно использовать возможности коллекций (там, понимаете, алгоритмы сортировки и поиска хорошие): создаём пустую коллекцию; по мере чтения из исходного файла добавляем в неё элементы с соответствующими ключами, например, так: colItems.Add sItem, sItem. Если возникает исключение, значит, добавляемая строчка уже в коллекции имеется; игнорируем её. Если исключения не возникает, добавляем в конечный файл строчку, содержащую sItem. Правда, такой метод накладывает ограничения на возможные символы, входящие в строку. Некоторые из них, впрочем, можно обойти, добавляя элементы с ключом, например, ("s" & sItem).

Ответить

Номер ответа: 5
Автор ответа:
 AlexSid



Вопросов: 4
Ответов: 27
 Профиль | | #5 Добавлено: 11.02.03 15:38

To DimaS:

Почему же? Если воспользоваться Быстрыми методами сортировки. Пирамидальной или Хоара, собственно. Если мне не изменяет память сложность их n*log(n). Плюс один раз пробежаться по массиву, после сортировки: n*(log(n)+1). На больших последовательностях (да, даже и не на очень больших), сложность будет меньше квадратичной.

Другой вопрос в том, что если последовательность слишком большая, держать в памяти весь массив не серьезно. Можно что-нибудь хэш-таблицы использовать, наверное. Или отсортировать файл предварительно...

И в противном случае тоже, если файл не слишком большой, то не важно, чем пользоваться. 1000 элементов без разницы чем сортировать: пузырьком или Хоаром...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам