![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте уважаемые форумчане!
Подскажите как можно сравнить два текстовых файлов на наличие повторений. Допустим в одном файле 1.txt записано: 3 1 4 1 2 2 3 2 4 2 5 2 6 2 1 3 2 3 3 3 4 3 5 3 6 3 1 4 2 4 3 4 4 4 В текстовом файле 2.txt записано: 2 1 3 1 1 2 4 3 2 4 3 4 4 4 5 5 6 5 В текстовом файле 1.txt необходимо убрать строки,которые совпадают со строками в 2.txt. Заранее благодарен за ответ! |
#2
|
||||
|
||||
![]() Немного G-кода
Код:
procedure TForm1.Button1Click(Sender: TObject); var i, j: integer; sl1, sl2, sl3: TStrings; flg: boolean; begin sl1:= TStringList.Create; sl2:= TStringList.Create; sl3:= TStringList.Create; sl1.LoadFromFile('1.txt'); sl2.LoadFromFile('2.txt'); for i := 0 to sl1.Count - 1 do begin flg:= true; for j := 0 to sl2.Count - 1 do if sl1.Strings[i] = sl2.Strings[j] then flg:= false; if flg then sl3.Add(sl1.Strings[i]); end; sl1.Free; sl2.Free; sl3.SaveToFile('1.txt'); sl3.Free; end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
bloodmaster89 (22.10.2013)
|
#3
|
||||
|
||||
![]() IndexOf() вместо второго цикла можно сделать.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#4
|
|||
|
|||
![]() Хочу добавить, что задачу по сравнению очень больших текстовых файлов решать лучше с помощью Memory Mapped Files и сравнивать файлы побайтово (если ASCII кодировка и по два байта, если Unicode). Указанный выше способ большие файлы будет сравнивать очень долго и в StringList можно загрузить только 2Gb, а если процесс 32 битный, то получаем, грубо говоря, что можно сравнить два файла суммарный размер которых не более 2Gb.
|
#5
|
||||
|
||||
![]() Ну раз пошла такая пьянка, то можно использовать мэппинг файлы.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#6
|
||||
|
||||
![]() Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#7
|
|||
|
|||
![]() Не ради наезда написал это, и дело не в том, что такая задача не была поставлена. Я сам не далеко ушел от новичка и в самом начале мне бы была полезна подобная информация, ею и поделился. Собственно, поэтому и написал Memory Mapped Files чтобы те, кому интересно, могли погуглить в целях общего развития.
|
#8
|
|||
|
|||
![]() Цитата:
Не сильно поможет. Все равно надо будет один из них загрузить в память. Если файлы действительно большие, то надо их отсортировать. Вот тогда можно обойтись малым объемом памяти. Хотя на диске все-равно будет много места занято, т.к. проидется создавать третий файл, содержащий результат. А для маленьких файлов Alegun был на правльном пути. Вот мой вариант: Код:
procedure TForm1.Button1Click(Sender: TObject); var i : integer; sl1, sl2 : TStrings; begin sl1:= TStringList.Create; sl2:= TStringList.Create; Try sl1.LoadFromFile('1.txt'); sl2.LoadFromFile('2.txt'); for i := sl1.Count - 1 downto 0 do if sl2.IndexOf(sl1[i]) >= 0 Then sl1.Delete(i); sl1.SaveToFile('1.txt'); Finally sl1.Free; sl2.Free; End; end; |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
bloodmaster89 (22.10.2013)
|
#9
|
|||
|
|||
![]() Всем спасибо за ответы! Тему можно закрыть
|