Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 20.08.2018
Сообщений: 25
1

Автоматическое чтение и сравнение значений в txt

21.08.2018, 17:16. Показов 603. Ответов 13

Author24 — интернет-сервис помощи студентам
Здравствуйте, есть такая на первый взгляд тривиальная задача. Но так как последний раз Делфи я открывал лет 10 назад то задача ввела меня в уныние.

Есть три txt файла

Файл Word1 - основной отсортированный список неповторяющихся слов
Файл Test1 - список слов которые надо проверить на совпадение с файлом Base1.txt
Файл Check1 - построчный список слов совпавших при сравнении файлов Word1 и Test1

Кусок кода с проверкой в ручном режиме через Edit работает, правда в один поток и с подвисанием.. Но главное что не ест опертивную память, суть в том что файл Word1 со временем может достичь несколько ГБ и желательно что б опера не забивалась во время работы.


Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
  S: String;
  F: TextFile;
begin
  AssignFile(F, 'C:\Dict\Word1.txt');
  Reset(F);
   S:='';
  while not Eof(F) and (Pos(Edit1.Text, S)=0) do
    ReadLn(F, S);
  CloseFile(F);
  if Pos(Edit1.Text, S)>0 then
    begin
      AssignFile(F, 'C:\Dict\Check1.txt');
      append(f);
      WriteLn(F, S);
      CloseFile(F);
    end;
Я так понимаю это должен быть цикл в цикле: читаем первую строчку с Test1.txt и гоняем ее по Word1.txt если есть совпадение, то пишем искомую строчку в Check1.txt если не нашли и дошли до конца файла Word1 то читаем вторую строчку с Test1.txt и так до окончания файла.

P.S. На хабре спрашивал у некоторых, мне ответили что через txt это идиотизм и надо делать через: SQLite с FTS4 в несколько потоков - вот тогда єто современно и быстро, но помочь никто не захотел. Честно пытался понять что это, о FTS4 не понял, ставил просто SQLite - с горем пополам удалось запусть ручной поиск по такой базе, но не впечатлило, ищет в раза два дольше чем мой код с txt файлом плюс в два раза места больше требует. Наверное я не умею готовить котов... Но мне надо просто рабочий инструмент, чем проще тем лучше...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.08.2018, 17:16
Ответы с готовыми решениями:

Автоматическое чтение и сравнение строк в txt
Здравствуйте, есть такая необычная задачка: Есть три txt файла Файл Base1 -єталонный основной...

Автоматическое сравнение строк в txt
Здравствуйте, есть потребность в таком инструменте: 1) Сравнение двух txt фалов, в каждом...

Сравнение извлеченных значений из txt-файла
Мир вам. Пытаюсь извлечь даты с последующим их сравнением из форматированного тестового файла....

Чтение матрицы из файла txt, перестановка минимальных значений
Помогите, пожалуйста. Нужно, чтобы матрица считывалась из фаила txt, выполнялась перестановка...

13
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
21.08.2018, 18:44 2
Так попробуйте.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.Button1Click(Sender: TObject);
var t1,t2:TStringList;
    i:Integer;
begin
t1:=TStringList.Create;
t1.LoadFromFile('Word1.txt');
t1.Delimiter:=' ';
t1.DelimitedText:=t1.Text;
t2:=TStringList.Create;
t2.LoadFromFile('Test1.txt');
t2.Delimiter:=' ';
t2.DelimitedText:=t2.Text;
for i:=t1.Count-1 downto 0 do
if t2.IndexOf(t1[i])>=0 then t1.Delete(i);
if t1.Count=0 then ShowMessage('Нет одинаковых слов')
else t1.SaveToFile('Check1.txt');
end;
Добавлено через 3 минуты
Файлы были в папке с программой, потому изменил имена.
1
0 / 0 / 0
Регистрация: 20.08.2018
Сообщений: 25
22.08.2018, 00:41  [ТС] 3
Здравствуйте! Попробовал, через 8-10 секунд - Out of memory. Размер файлов: Word1 - 300мб, Test1 - 1кб, Check1 - 0кб

При запуске программы размер процесса ~3мб, после нажатия кнопки размер быстро увеличивается и при 1 439 296 КБ вылетает вышеуказаная ошибка. Програма запускалась с SSD, загрузка процессора ~8%, свободной оперативной памяти при ошибке оствалось еще около 5гб.

Подозреваю StringList..

Добавлено через 7 минут
P.S При использовании файлов Word1 - 3кб, Test1 - 1кб, Check1 - 0кб, програма успешно проходит цикл, но в файле Check1 - весь список слов из Word1. Хотя там нет слов которые в Test1 (и там всего 5)..
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
22.08.2018, 09:46 4
если в начале у вас L := TStringList.Create то в конце должно быть L.Free
и никаких чудес
0
0 / 0 / 0
Регистрация: 20.08.2018
Сообщений: 25
23.08.2018, 01:09  [ТС] 5
Толку от L.Free если код не делает то что должен.
0
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,252
23.08.2018, 02:05 6
Цитата Сообщение от Waitman Посмотреть сообщение
Здравствуйте, есть такая на первый взгляд тривиальная задача.
А где есть эта задача? В вашем вопросе никакой задачи не сформулировано!
Там есть только кусок кода непонятно что делающий.
Цитата Сообщение от Waitman Посмотреть сообщение
Толку от L.Free если код не делает то что должен.
А что он должен делать?
0
0 / 0 / 0
Регистрация: 20.08.2018
Сообщений: 25
23.08.2018, 09:38  [ТС] 7
Ну если Вам сложно связать несколько строк в одно, то вот:

Есть три txt файла

Файл Word1 - основной отсортированный список неповторяющихся слов
Файл Test1 - список слов которые надо проверить на совпадение с файлом Base1.txt
Файл Check1 - построчный список слов совпавших при сравнении файлов Word1 и Test1

Читаем первую строчку с Test1.txt и гоняем ее по Word1.txt если есть совпадение - то пишем искомую строчку в Check1.txt если не нашли и дошли до конца файла Word1 то читаем вторую строчку с Test1.txt и так до окончания файла.

Смысл в том что б выявить дубляжи слов которые есть в Test1 при сравнении с основным словарем - Word1. И показать только эти дубляжи в файле Check1. Вот основная задача.

P.S Конечно в идеале хорошо б было что б програма могла использовать несколько ядер а не одно и показывать прогрес чтения файла Test1. Но я буду благодарен и просто за рабочую програму без свистелок и перделок.
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
23.08.2018, 09:48 8
Цитата Сообщение от Waitman Посмотреть сообщение
через 8-10 секунд - Out of memory
Цитата Сообщение от Waitman Посмотреть сообщение
Толку от L.Free
может и есть толк?

ну и как вам уже сказали. без точного ТЗ результат ХЗ.
как там у вас эти слова хранятся?
одно в строке? через пробел, запятую?...

для решения задачи неплохо бы видеть сами файлы
а решение #2 для некоторых видов файлов выглядит правильным
раз нам файлов не дали, то придумываем самостоятельно, все верно
0
0 / 0 / 0
Регистрация: 20.08.2018
Сообщений: 25
23.08.2018, 10:29  [ТС] 9
Файлы самые обычные, все слова цельные без пробелов, без знаков а-ля: /*-_+ и т.д Одно слово в строке


Например в файле Word1:

Banjaxed
Deadly
Fag
Gas
Gob
Paralytic
Savage
Scratcher
Slagging
Sound
Wheesht

В файле Test1:

Nettle
Plank
Savage
Scoops

Программа на выходе в файле Check1 должна давать такой результат:

Savage

Поскольку Savage это единственное что есть общего в двух файлах Word1 и Test1.

Добавлено через 6 минут
Все файлы отсортированы предварительно от А до Я
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
23.08.2018, 10:38 10
Поправьте у меня строку 14, не так понял.
Delphi
1
if t2.IndexOf(t1[i])<0 then t1.Delete(i);
0
0 / 0 / 0
Регистрация: 20.08.2018
Сообщений: 25
23.08.2018, 17:59  [ТС] 11
Спасибо! Начало коректно работать, жор памяти остановился на 1 479 168 КБ, правда сравнение 300мб и 20мб уже идет минут 5, закрузка процесса 8%, как возможно разбить задачу на потоки, ну например на 5-10 ? Читал за SetThreadAffinityMask - это оно ?

Добавлено через 5 часов 42 минуты
По прошествии 5 часов программа все еще работает
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
23.08.2018, 20:25 12
такое бывает когда программист головой не думает

достаточно посчитать количество сравнений и умножить на время 1 сравнения
советую загнать в табличку SQLite, проиндексировать и запросом выдать результат
0
0 / 0 / 0
Регистрация: 20.08.2018
Сообщений: 25
23.08.2018, 20:36  [ТС] 13
У меня есть тестовый вариант с поиском 1 слова по Edit по подключенной базе SQLite. Тот же самый файл в 300мб при поиске 1 слова дает 4 сек, еще и жрет пам'ять, если автоматизировать то выходит 10 000 слов будет шарашить 11 часов. Это абсолютно неприемлимо..
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
23.08.2018, 22:46 14
у меня в базе MSSQL есть таблица с адресами, поиск части адреса по колонке без индекса занимает 8-10 минут
в таблице 81 миллион строк

почему мне не приходит в голову задавать вопрос по скорости в ветке по MSSQL?
0
23.08.2018, 22:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.08.2018, 22:46
Помогаю со студенческими работами здесь

Чтение из файла 'New.txt', запись четных строк в '1.txt', а нечетных в '2.txt'
В общем все работает, но есть &quot;НО&quot;, иначе бы не открывал тему. Содержимое исходного файла: 1 1 1...

Чтение TXT (DXF) и вывод в TXT
Здравствуйте! По роду деятельности - инженер, пытаюсь написать программу по конвертации DXF в...

Чтение данных с одного txt файла, запись данных во второй txt в определенную позицию
Добрый день, уважаемые форумчане! Нужна ваша помощь. Задача поставлена так: существует файл...

Автоматическое создание txt файлов
Всем привет. Есть ли программа, которая могла бы генерировать текстовые файлы с определенным...


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

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