Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2012, 23:31   #1
blblbl-org
Пользователь
 
Регистрация: 18.04.2012
Сообщений: 12
По умолчанию Самое быстрое сравнение текстовых файлов

Товарищи, есть вопрос:

есть 2 текстовых файла, по 10 мегабайт
как максимально быстро сравнить строки этих файлов с выводом результата в третий файл?

т.е.

"файл 1":

а1
б1
в1

"файл 2":
а1
б2
в1

в "файл 3" тогда будет записано
б2

на данный момент делаю так:

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
List1 := TStringList.Create;
List2 := TStringList.Create;
ListOut := TStringList.Create;

List1.LoadFromFile('c:\1.txt');
List2.LoadFromFile( 'c:\2.txt');

 for i := 0 to List1.Count - 1 do
 begin
  if pos(List1[ i ], List2.Text) = 0 then
    ListOut.Add(List1[ i ]);
 end;
 ListOut.SaveToFile('c:\3.txt');
  showmessage('OK');
  end;
но это как то нереально долго...
если "файл 1" = 8мб, а "файл 2" = 1мб, то обработка занимает больше часа... На intel core i3 с 4гб

Последний раз редактировалось artemavd; 24.04.2012 в 07:14.
blblbl-org вне форума Ответить с цитированием
Старый 23.04.2012, 23:37   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Загрузить оба файла как бинарные, сравнить в памяти, сформировать образ выходного файла в памяти, вывести файл на диск как бинарный.
Это все займет менее секунды.
s-andriano вне форума Ответить с цитированием
Старый 23.04.2012, 23:54   #3
blblbl-org
Пользователь
 
Регистрация: 18.04.2012
Сообщений: 12
По умолчанию

а поподробнее ??
blblbl-org вне форума Ответить с цитированием
Старый 24.04.2012, 00:55   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

раз уже есть привязка к тому что он текстовый(строки), то кроме как построчно не получится никак.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.04.2012, 04:19   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Почему? Любые данные можно рассмотреть как набор байт.
Главное привести TXT к одной кодировке, иначе побайтное стравнение будет бессмысленно и беспощадно.

Если не хотите хардкора, то TFileStream,TMemoryStream вам в помощь.
Если же хотите дейтвительно разобраться, и даже сделать быстрее, то начинка выше упомянутых классов вам в помощь.
Человек_Борща вне форума Ответить с цитированием
Старый 24.04.2012, 10:19   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Человек_Борща, придется искать границы строк, из низ образуя блоки для сравнения.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.04.2012, 11:21   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

зачем? Это же байты!
Человек_Борща вне форума Ответить с цитированием
Старый 24.04.2012, 11:30   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
зачем? Это же байты!
вот именно, что БАЙТЫ. А в исходной задачи нужно сравнивать СТРОКИ!
Вы исходное условие внимательно читали?
например, первый файл:
sss
dd
bb

второй файл
sss
ggggggggggggg
bb

программа сравнения должна (по мнению TC) выдать в третий файл
ggggggggggggg

А что выдаст ваше побайтовое сравнение?!

p.s. я бы взял обычные TStringList, загрузил туда исходные файлы и банально в цикле сравнивал! 10Мб - это детский сад!

Правда, в задачах нахождения отличия между текстовыми файлами есть ряд нюансов, учитывать их или нет зависит от TC (точнее от задачи, которую он решает).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.04.2012, 11:34   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

не всяк байт символом является.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.04.2012, 11:40   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Если задачка "для себя", то можно попробовать воспользоваться программой comp (win+r -> cmd -> comp /? для просмотра синтаксиса).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение данных в текстовых файлах zhukovms Помощь студентам 34 05.09.2011 11:58
ОБРАБОТКА текстовых файлов Kirillnd C++ Builder 2 31.07.2011 16:40
Обработка текстовых файлов. kolobot Помощь студентам 2 15.12.2010 21:14
копирование текстовых файлов teacher Общие вопросы Delphi 4 16.02.2008 20:29
Сравнение текстовых файлов BR17UY Общие вопросы Delphi 15 07.05.2007 20:18