|
Вопрос # 2 933/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
помогите разделить код на две кнопки. на первой открытие одновременно МНОГО файлов, а на второй выполнение условия и сохранение результата в один файл.
Приложение: Переключить в обычный режим- procedure Tpar.Button1Click(Sender: TObject);
- var
- i, j, n, m: Integer;
- FName: string;
- TempStrings: TStrings;
- begin
- if (OpenDialog1.Execute()) then
- begin
- TempStrings := TStringList.Create();
- try
- for j := 0 to (OpenDialog1.Files.Count - 1) do
- begin
- FName := OpenDialog1.Files[j];
- TempStrings.LoadFromFile(FName);
- for i:=TempStrings.Count-1 downto 0 do
-
- TempStrings.Delete(i);
- n:=0;
- while not (n>=(TempStrings.Count - 1)) do
- begin
- for m:=TempStrings.Count-1 downto n+1 do
- if (TempStrings.Strings[n] = TempStrings.Strings[m]) then
- TempStrings.Delete(m);
- inc(n)
- end;
- end;
- finally
- TempStrings.Free();
- end;
- end;
- end;
 |
Вопрос задал: fedora (статус: Посетитель)
Вопрос отправлен: 21 июня 2009, 18:20
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Попробую включить телепатор. Если всё так, как я понял, то вот:
// Подразумевается, что в секции private формы Tpar есть поле FList: TStringList
// и то, что это поле проинициализировано FList:= TStringList.Create() где-нить
// в конструкторе или OnCreate формы.
// Открытие кучи файлов и сваливание их содержимого в один список в памяти.
procedure Tpar.Button1Click(Sender: TObject);
var
Temp: TStringList;
Index: Integer;
begin
if not OpenDialog1.Execute()
then Exit;
FList.Clear();
Temp:= TStringList.Create();
try
for Index:= 0 to OpenDialog1.Files.Count - 1 do
try
Temp.LoadFromFile(OpenDialog1.Files[Index]);
FList.AddStrings(Temp);
except
ShowMessage('Мощщный ЕРРОР!');
Break;
end;
finally
Temp.Free();
end;
end;
// Поиск в списке и сохранение в файл строк списка, в которых есть слово "лицензия"
procedure Tpar.Button2Click(Sender: TObject);
var
Temp: TStringList;
Index: Integer;
begin
if not SaveDialog1.Execute()
then Exit;
Temp:= TStringList.Create();
try
for Index:= 0 to FList.Count - 1 do
if (Pos('лицензия', FList[Index]) <> 0) and (Temp.IndexOf(FList[Index]) = -1)
then Temp.Add(FList[Index]);
try
Temp.SaveToFile(SaveDialog1.FileName);
except
ShowMessage('Мощщный ЕРРОР!');
end;
finally
Temp.Free();
end;
end;
Вот типа так.
АХТУНГ! Код не отлаживал, писал в браузере!
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 21 июня 2009, 18:54
|
Мини-форум вопроса
Всего сообщений: 27; последнее сообщение — 25 июня 2009, 11:25; участников в обсуждении: 3.
Страницы: [1] [2] [Следующая »]
|
min@y™ (статус: Доктор наук), 21 июня 2009, 18:35 [#1]:
Сформулируй задачу иначе.
Типа, есть много файлов, их надо все открыть, найти и выбрать, исключая повторы, из них все строки, в которых есть подстрока "лицензия" и сохранить список найденных строк в файл.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
fedora (статус: Посетитель), 21 июня 2009, 22:02 [#2]:
спасибо. завтра обязательно проверю.
и задачу вы правильно сформулировали
|
|
fedora (статус: Посетитель), 22 июня 2009, 09:07 [#3]:
странно.
при проверке вылетает ошибка на строчке FList.Clear();
и не надо ли в опциях выставить ofAllowMultiSelect?
|
|
min@y™ (статус: Доктор наук), 22 июня 2009, 09:25 [#4]:
Прежде чем использовать FList, его надо создать
FList:= TStringList.Create();
Обрати внимание на мой комментарий в начале ответа.
Цитата (fedora):
и не надо ли в опциях выставить ofAllowMultiSelect?
В опциях чего? Opendialog1? Да, надо, если требуется выбирать сразу несколько файлов.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
fedora (статус: Посетитель), 22 июня 2009, 12:07 [#5]:
спасибо. все заработало.
а подскажите по условиям?
в строке:
if (Pos('лицензия', FList[Index]) <> 0) and (Pos('имеется', FList[Index])
and - это и
or - или
а какие еще есть параметры? где бы прочитать?
и как сделать, чтобы искал строки и 'лицензия' и 'копия', но не в одной строке а в разных?
|
|
Вадим К (статус: Академик), 22 июня 2009, 12:22 [#6]:
есть xor к примеру. это "исключающие или".
ну и not - отрицание.
А вот что бы найти в разных строках, надо отдельно поискать одну строку, потому вторую.
а можно проще. Зачем искать циклом по каждой строке, если можно сразу по всему тексту...
где то так
if (Pos('лицензия', FList.text) <> 0) and (Pos('имеется', FList.text)
Галочка "подтверждения прочтения" - вселенское зло.
|
|
fedora (статус: Посетитель), 22 июня 2009, 12:45 [#7]:
удалено
|
|
min@y™ (статус: Доктор наук), 22 июня 2009, 13:04 [#8]:
Цитата:
и как сделать, чтобы искал строки и 'лицензия' и 'копия', но не в одной строке а в разных?
if (Pos('лицензия', FList[Index]) <> 0) xor (Pos('копия', FList[Index]) <> 0) then ...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 22 июня 2009, 13:05 [#9]:
Цитата (Вадим К):
Зачем искать циклом по каждой строке, если можно сразу по всему тексту...
Потому что требуется отфильтровать именно строки по данному словию.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 22 июня 2009, 13:09 [#10]:
я фразу "и как сделать, чтобы искал строки и 'лицензия' и 'копия', но не в одной строке а в разных?" понимаю как "в тексте должны быть обе эти строки, но они могут быть в разных строках". Хотя что прийдет в голову автору вопроса...
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 22 июня 2009, 13:21 [#11]:
Не, если в строке есть либо "лицензия", либо "копия", значит строку добавляемя в список, иначе - игнорируем.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
fedora (статус: Посетитель), 22 июня 2009, 14:08 [#12]:
1. not у меня не сработал - ошибка, зато xor - то, что надо.
2. в тексте есть несколько строк, в которых встречаются слова 'лицензия' и 'копия' и в месте и по отдельности.
лицензия верна
лицензия и копия верна, но дата закончилась
копия верна
тут другая информация
копия отсутствует
лицензия отсутствует и дата открыта
<CODE>
if (Pos('лицензия', FList[Index]) <> 0) xor (Pos('копия', FList[Index]) <> 0) then ...
</CODE>
но необходимо еще одно условие 'верна', т.е. если я напишу
<CODE>
if (Pos('лицензия', FList[Index]) <> 0) and (Pos('верна', FList[Index]) <> 0) xor (Pos('копия', FList[Index]) <> 0) and (Pos('верна', FList[Index]) <> 0) then ...
</CODE>
и верно я понимаю, что найдутся строки со словами 'лицензия верна' либо 'копия верна'.
извините, что так пишу. у меня принудительно отключены java scripts.
а можно еще добавить в код автоматом удаление дублей? как в первоначальном примере?
|
|
Вадим К (статус: Академик), 22 июня 2009, 14:12 [#13]:
not не сработал... да, его надо правильно готовить
...
по последнему вопросу. таке найдуться "верна копия", "моя лицензия также верна" и тому подобное.
Но если будет строка "моя копия и лицензия верна", то не найдеться.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
fedora (статус: Посетитель), 22 июня 2009, 14:25 [#14]:
а почему "моя копия и лицензия верна" не найдется? я же ищу строку со словами 'лицензия' и 'верна' либо 'копия' и 'верна'
|
|
min@y™ (статус: Доктор наук), 22 июня 2009, 14:29 [#15]:
Короче, на русском языке сформулируй чётко и недвусмысленно условие добавления строки в список. А я напишу тебе код этого условия.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
fedora (статус: Посетитель), 22 июня 2009, 14:53 [#16]:
лучше я еще додумаю какие условия применять.
подскажите лучше как в
procedure Tpar.Button2Click(Sender: TObject);
из предыдущей странице, добавить автоматическое удаление дублирующих строк.
|
|
Вадим К (статус: Академик), 22 июня 2009, 14:53 [#17]:
"а почему "моя копия и лицензия верна" не найдется? я же ищу строку со словами 'лицензия' и 'верна' либо 'копия' и 'верна'"
потому что "либо", а не "или".
потому что xor. Читаем внимательно литературу, что бы узнать, что такое "исключающее или". (гугл точно подскажет).
вообще то то, что в языках программирования называтся or следует переводить как "и/или". Тогда всё станет на свои места.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Вадим К (статус: Академик), 22 июня 2009, 15:00 [#18]:
а вот дублирующие строки удалять - это уже весело. Эх, в линуксовской консоли это делается в одно движение левой ногой.
Например, есть кучка файлов в папке и вложенных. задача - выбрать все строки, где есть слово лицензия и верна и сложить в файл. одинаковые строки не включать.
grep -r 'лицензия' | grep -e 'верна' | sort | uniq > rezult.txt
еще и отсортирует
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 22 июня 2009, 15:15 [#19]:
Цитата (fedora):
подскажите лучше как в
procedure Tpar.Button2Click(Sender: TObject);
из предыдущей странице, добавить автоматическое удаление дублирующих строк.
Там уже есть такое условие, читай внимательнее:
if ... and (Temp.IndexOf(FList[Index]) = -1)
then Temp.Add(FList[Index]);
Это означает, буквально: если такой строки нету в списке, то добавить её.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
fedora (статус: Посетитель), 22 июня 2009, 15:23 [#20]:
"Это означает, буквально: если такой строки нету в списке, то добавить её. "
добавить-то добавляет. из текста:
лицензия от 10.10.09
лицензия от 10.10.09
отказано
отказано
лицензия от 11.10.09
лицензия от 12.10.09
лицензия от 10.10.09
лицензия от 10.10.09
по условию 'лицензия от 10.10.09' он добавит:
лицензия от 10.10.09
лицензия от 10.10.09
лицензия от 10.10.09
лицензия от 10.10.09
а мне надо всего одну строку 'лицензия от 10.10.09', остальные (повторные) убрать.
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|