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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2012, 22:19   #1
Зод
Форумчанин
 
Регистрация: 25.08.2011
Сообщений: 140
По умолчанию Pos в делфи

может ли не выполнятся пос в делфи? и если да то почему это происходит?
есть такой код
Код:
Memo4.Lines.LoadFromStream(HTTP.Document);
s := Utf8ToAnsi(Memo4.Text);
i2:=Copy(s,Pos('О клубе,s)+2,Pos('search_settings',s));
i2:=Copy(i2,Pos('b-link',i2)+2,Pos('search_settings',s));
   i2:=Copy(i2,Pos('b-link',i2)+2,27);
   i2:=Copy(i2,Pos('января',i2),Pos('января',i2)+6);
   i2:=Copy(i2,Pos('января',i2),Pos('января',i2)+Length('января')-1);
   if i2='января' then
   god:=1;
сколько раз не запускал пос находит не первый b-link а помойму 13, в конце страницы. Причем первые два pos выполняются нормально и этот код на других страницах работает нормально.
как так?
забыл сказать в блокноте по исходнику веб странице все правильно нахожу повторяя действия. Это не страница виновата получается а именно поиск в Делфи.

Последний раз редактировалось Зод; 27.08.2012 в 22:21.
Зод вне форума Ответить с цитированием
Старый 27.08.2012, 22:40   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

не пишите сложный код. Используйте переменные.
переписваем ВАШ код с переменными и видим

Код:
 n1:=Pos('О клубе,s)+2;
 n2:=Pos('search_settings',s);
i2:=Copy(s,n1+2,n2);
В качестве третьего парметра Copy указана не ДЛИНА (количество символов для коприрования), а позиция НЕВЕРНО
стало быть доверять дальнейшим использованиям результатам i2 НЕВОЗМОЖНО.

Код:
 n1:=Pos('b-link',i2);
 n2:=Pos('search_settings',s);
i2:=Copy(i2,n1+2, n2);
Здесь кроме того n2 индекс в одной строке s использован для выделения в совсем другой строке i2.

Дпальнейший анализ кода бессмысленен.

Кроме того, учитывая синтаксические ошибки в коде, складывается впечатление о несоответствии приведенного фрагмента реальному коду.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 27.08.2012 в 22:51.
evg_m вне форума Ответить с цитированием
Старый 27.08.2012, 22:54   #3
Зод
Форумчанин
 
Регистрация: 25.08.2011
Сообщений: 140
По умолчанию

а можно поподробнее а то я мало что понял.
то есть я указываю позицию не верно? но код же работает почти всегда, ошибаеется редко. Мне казалось если бы я не правильно указывал что и куда копировать то постояно были бы ошибки. И как ее указать правильно? не прибавлять значение?

Код:
 n1:=Pos('О клубе,s)+2;
 n2:=Pos('search_settings',s);
i2:=Copy(s,n1+2,n2);
а почему в третьей строчке n1+2? мы же n1 определяем как:
Код:
 n1:=Pos('О клубе,s)+2;
То есть к значению пост прибавляем +2,да и смысл не меняется. Допустим n1=35 и n2=50
i2 же скопирует строку между 35 и 50 символами? тогда почему она промахивается и находит слово которое стоит в тексте посередине а не в конце и не в начале?
__________________
а чем это вам мой код не понравился?)
6 месяцев уже так пос использую, увидел пример на этом форуме и пошло. Грузить документ синапса в мемо? тоже здесь посоветовали. Конвертировать ютв в анси? не на этом но тоже форуме нашел. И вообще можно конкретнее? Пинать самоучку хоть фактами нужно.

Последний раз редактировалось Зод; 27.08.2012 в 23:04.
Зод вне форума Ответить с цитированием
Старый 27.08.2012, 23:23   #4
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

Зод приведите пример анализируемой страницы и что Вы хотите из нее вытащить. Явно Вы сильно усложнили код.
Ну и возможно (с кодом не разбирался) Вам поможет PosEx
astecenko вне форума Ответить с цитированием
Старый 27.08.2012, 23:37   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от Зод Посмотреть сообщение
Мне казалось если бы я не правильно указывал что и куда копировать то постояно были бы ошибки
Нет, просто молча копировалось не то, что надо или не копировалось вообще

Цитата:
Сообщение от Зод Посмотреть сообщение
Допустим n1=35 и n2=50
i2 же скопирует строку между 35 и 50 символами?
Нет, копируется 50 символов начиная с 35, т.е. интервал [35; 84]

Цитата:
Сообщение от Зод Посмотреть сообщение
Грузить документ синапса в мемо?
Как душе угодно. Хотя если визуализация не нужна, то можно, например, в string или какой-нибудь другой тип
Цитата:
Сообщение от Зод Посмотреть сообщение
а чем это вам мой код не понравился?)
нечитабельно, сложно анализировать, легко запутаться
eoln вне форума Ответить с цитированием
Старый 27.08.2012, 23:41   #6
Зод
Форумчанин
 
Регистрация: 25.08.2011
Сообщений: 140
По умолчанию

Цитата:
Сообщение от astecenko Посмотреть сообщение
Зод приведите пример анализируемой страницы и что Вы хотите из нее вытащить. Явно Вы сильно усложнили код.
Ну и возможно (с кодом не разбирался) Вам поможет PosEx
http://clubs.ya.ru/4611686018427412111/
дату правильную, в данном случае 9 июля.

Цитата:
Сообщение от eoln Посмотреть сообщение
Нет, просто молча копировалось не то, что надо или не копировалось вообще


Нет, копируется 50 символов начиная с 35, т.е. интервал [35; 84]


Как душе угодно. Хотя если визуализация не нужна, то можно, например, в string или какой-нибудь другой тип

нечитабельно, сложно анализировать, легко запутаться
ну так в этом и смысл сверяться с словом. Если бы копировалась нето то на одном из этапов просто индексы для копирования пос бы не нашел и результат 0.

незнал но все равно там же стоит окончание документа, лишнее не скопирует а там где нужна точность у меня стоит 27, 27 символов.

Можно и в стринг но я уже привык как то к мемо.
Для себя только так пишу, разметку делать все равно смысла нет. Вот только как разметка отражается функционнал и подленность кода для меня загадка)

Цитата:
Сообщение от evg_m Посмотреть сообщение
Здесь кроме того n2 индекс в одной строке s использован для выделения в совсем другой строке i2.
принципиальной разницы не вижу в том где брать положение.
вот взял я строчку в 70 символов и урезал по 20-60, далее снова урезаю с 20-70, все равно в пос попадет только 20-69 не? откуда ему лишние символы брать?

Последний раз редактировалось Зод; 28.08.2012 в 00:01.
Зод вне форума Ответить с цитированием
Старый 28.08.2012, 10:10   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
s:='1234567';
r:=copy(s,2,5); //5 символов начиная с 2 т.о. r:='23456';
Цитата:
принципиальной разницы не вижу в том где брать положение.
мы получаем НОВУЮ строку в которой СОВСЕМ другие индексы по сравнению с исходной.
Код:
n1:=pos('4',r); // в этой (r) строке 4 стоит на 3 месте. 
n2:=pos('4',s); // в этой (s) строке 4 стоит на 4 месте. 
r2:=copy(s, 3, ...); // r2:='34567';
r3:=copy(r, 3, ...); // r3:='456';
r4:=copy(s, 4, ....); // r4:='4567';
r5:=copy(r, 4, ....); // r5:='56';
Цитата:
а почему в третьей строчке n1+2? мы же n1 определяем как:
copy paste подводит. Конечно же
Код:
 n1:=Pos('О клубе,s);
 n2:=Pos('search_settings',s);
i2:=Copy(s,n1+2,n2);
Кстати здесь есть еще и алгоритмическая ошибка.
Всегда есть вероятность что 'seach_settings' встретиться в тексте раньше чем 'О клубе'. Знаю, что скажете "такого не может быть никогда, потому что не может быть". но как показывает опыт невероятное обязательно сбывается, даже в том случае если этот текст (который разбираете) вы пишете сами же. Например подвел невнимательный copy paste. смотри пример выше.
Для этого пригодится PosEx
Код:
 n1:=Pos('О клубе,s);
 n2:=PosEx('search_settings',s, n1);
i2:=Copy(s,n1+2, <сколько там будет символов от n1+2 до n2 ?>);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 28.08.2012 в 10:33.
evg_m вне форума Ответить с цитированием
Старый 28.08.2012, 10:37   #8
Зод
Форумчанин
 
Регистрация: 25.08.2011
Сообщений: 140
По умолчанию

Ну так это я понимаю, еще с showmessage определяю что находится. +1 стоит что бы слово перекрыть. Например есть текст: Ванечка, Катюшка,НГТУ, НГТУ, Ванечка 12. Мне нужно к примеру извлечь ВАнечка 12. Отсюда я нахожу pos(НГТУ) +1 потом от НГТУ до конца( максимум строки=38) и далее получается поиск Ванечка, в итоге получается нормальный результат. Длина везде стоит максимум (это больше чем будет в итоге) Поскольку слова одинаковые то мы их обрезаем +1 дабы не находились второй раз. Это я все знаю, читал про пос.
У меня вопрос был в другом почему пос не ищет слово конкретное. В документе куча b-link, уникальных слов мало. Поэтому я ищу первое b-link и сразу текст уменьшаю дабы первый b-link ушел. Дальше ищу b-link (второй уже) и его тоже обрезаю (зачем? сам не помню)) далее ищу ключевое слово это месяц, результат поиска сравниваю с названием месяца. Если слова совпали то поиск выполнен успешно.
Вот здесь где моя ошибка?
У меня более 90% случаев выполняются нормально но бывает так:
находит первый b-link, урезает его, а вместо второго b-link находит НЕ ПЕРВЫЙ в тексте а хрен знает какой по счету (и не последний) как так то?
В результате чего находится не первое значение и соответственно не правильно опознается месяц.
Это тоже самое что:
Код:
s:='1234567890174937483987493JPEG3648384578JPEG....JPEG53647csdsJPEG,,,JPEG';
i2:=Copy(i2,Pos('JPEG',i2)+2,20);
i2:=Copy(i2,Pos('JPEG',i2)-1,Pos('JPEG',i2)+7);
и получить в результате JPEG,,,
почему нашелся не ПЕРВЫЙ JPEG а предпоследний(и не последний, в чем логика поса?)?

Последний раз редактировалось Зод; 28.08.2012 в 10:50.
Зод вне форума Ответить с цитированием
Старый 28.08.2012, 11:07   #9
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

Не понятно, почему Вы привязались к этому b-link, насколько я понял этот класс используется для форматирования ссылок вообще, коих в анализируемой странице куча. Даты форматируются классом b-date, почему бы не анализировать по нему.
Например: ваша искомая дата "9 июля" отформатирована так
Код:
<span class="b-date"><a href="http://clubs.ya.ru/4611686018427412111/replies.xml?item_no=48" class="b-link">9 июля 2010 года, 16:16</a></span>
Если посмотреть другие даты то увидим что они отформатированы аналогично:
Код:
<span class="b-date"><a href="*" class="b-link">*</a></span>
Что Вам мешает используя цикл по PosEx перебирать все соответствия маске
Код:
<span class="b-date"><a href="
Потом в теле цикла опять же с помощью PosEx находить первый символ ">" и первый символ "<" между ними и будет текст с датой. Так можете перебрать все даты на странице. Получив текст даты, тут же в цикле анализируйте его как Вам угодно. Итого у Вас будет 3 вызова функции PosEx для того чтобы найти дату (и т.д. в цикле). Ничего обрезать не надо.
astecenko вне форума Ответить с цитированием
Старый 28.08.2012, 12:28   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
и получить в результате JPEG,,,
почему нашелся не ПЕРВЫЙ JPEG а предпоследний(и не последний, в чем логика поса?)?
Логика Pos в поиске именно в том месте где указали.

Код:
s:='1234567890174937483987493JPEG3648384578JPEG....JPEG53647csdsJPEG,,,JPEG';
А i2 чему равно??? НЕИЗВЕСТНО!!!! дальше мы работаем с неизвестными данными i2
i2:=Copy(i2,Pos('JPEG',i2)+2,20); // потому что ищем черт знает где странно что вообще что-то нашли!!!
а теперь еще и копируем незнамо-что !!!
i2:=Copy(i2,Pos('JPEG',i2)-1,Pos('JPEG',i2)+7); // продолжаем работать непойми с чем!!!!
Код:
s:='1234567890174937483987493JPEG3648384578JPEG....JPEG53647csdsJPEG,,,JPEG';
  i2:=s; //исправляем предыдущее замечание! (теперь знаем что лежит в i2)
// выводим результаты!!!!!!!!!
  self.Memo1.Lines.Add('I2: '+ I2);
  self.Memo1.Lines.Add(' Pos(''JPEG'',i2) ='+inttostr(Pos('JPEG',i2)));

  i2:=Copy(i2,Pos('JPEG',i2)+2,20);
// еще раз выводим !!!!!!!!!
  self.Memo1.Lines.Add('I2: '+ i2);
  self.memo1.lines.add(' Pos(''JPEG'',i2) =' +inttostr(Pos('JPEG',i2)));

  i2:=Copy(i2,Pos('JPEG',i2)-1,Pos('JPEG',i2)+7);
// еще раз выводим !!!!!!!!!
  self.Memo1.lines.Add('I2: ' +I2);
и смотрим результаты все ОК.
Код:
I2: 1234567890174937483987493JPEG3648384578JPEG....JPEG53647csdsJPEG,,,JPEG
 Pos('JPEG',i2) =26
I2: EG3648384578JPEG....
 Pos('JPEG',i2) =13
I2: 8JPEG....
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 28.08.2012 в 12:38.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
copy pos Gudzik11 Общие вопросы Delphi 5 22.05.2012 08:57
if not Pos Shouldercannon Общие вопросы Delphi 9 01.02.2012 15:48
copy or pos(делфи) lama90 Помощь студентам 1 31.05.2011 18:17
pos и copy zotox Помощь студентам 1 23.10.2008 21:13