Advertisement
Guest User

Untitled

a guest
Jan 18th, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.02 KB | None | 0 0
  1. var
  2. l, np: integer;//переменная l - номер строки с таблицей в .html документе, np - номер страницы, список акков расположен на 8 разных страниц, нужна для смены файлов, ниже увидешь
  3. a: string;//нужна для хранения строки с таблицей
  4. f, r: text; //f, r - текстовый файл(работает и с .html файлами, но я .html переделал в .txt, хз зачем)
  5.  
  6. function getName(i: integer): string;//объявление функции, в которую передается параметр i, она возвращает тип string(т.к. должна вернуть ник)
  7. var
  8. k: integer;//нужна как счетчик
  9. s: string;//нужна для хранения результата
  10. begin
  11. k := PosEx('</a', a, i) - 1;//posex ищет позицию подстроки(</a) в строке (а) с позиции (i) и присваивает ее счетчику
  12. while a[k] <> '>' do//т.к. тэг (</a) идет после ника, то вытаскивать его нужно справа на лево. После (>) идет ник, значит когда его встретим - весь ник прочитан
  13. begin//общий вид таков: '>nickname</a, здесь PosEx('</a', a, i) выдаст позицию 9, ну или 10, проверь)
  14. s += a[k];//(s+=a[k]) равнозначно (s:=s+a[k]), просто короче и удобней и на джаве вроде есть. Здесь в переменную s заносится посимвольно ник
  15. k -= 1; //т.к. чтение происходит справа на лево (от тега (</a) до скобки (>), то счетчик нужно уменьшать (позиция (</a) выше, чем у (>))
  16. end;
  17. result := reversestring(s);//т.к. чтение было право-лево, то ник получился перевернутым и reversestring перевернет его в нормальный вид. result нужен для того, чтобы функция вернула результат
  18. end;
  19.  
  20. begin
  21. assign(r, 'C:\Users\Андрей\Desktop\WSPascal\desperado\list clan members\output\list.txt');//связывает файл, в который будет записан список с переменной r
  22. rewrite(r);//открывает его на перезапись
  23. for np := 1 to 8 do//т.к. документов целых 8, то нужно 8 раз все это читать.
  24. begin//документы имеют названия "1.txt", "2.txt", "3.txt" и т.д. чтобы было удобно в цикле по ним пробегать
  25. assign(f, 'C:\Users\Андрей\Desktop\WSPascal\desperado\list clan members\source\input\' + np + '.txt');//связывает необходимый файл(зависит от np) с переменной f
  26. reset(f);//открывает на чтение
  27.  
  28. while l <> 139 do//нужная нам строка с таблицей на 139 позиции, дальше читать смысла нет
  29. begin
  30. l += 1;//здесь происходит посути пустое чтение
  31. readln(f, a);//если вдруг возникла мысль, что можно было чутка оптимизировать переместив это за условие, как у меня, когда я писал этот коммент, то нет. если это сделать, строчка не будет меняться, так устроен паскаль. (если ничего не понял, забей:) )
  32. if l = 139 then//когда наконец считается 139 строка, где таблица, то можно начать работу
  33. for var i := 1 to length(a) do//тут происходит посимвольное разбирание строки с таблицей, не самое эффективное, но это и не требуется.
  34. if PosEx('</a', a, i + 1) <> PosEx('</a', a, i) then //здесь проверяется равны ли позиции тега (</a) в данной позиции и позиция этого тега в увеличенной на 1 позиции.
  35. writeln(r, getName(i));//т.е. (>asddsa</a><>gbvvc</a) если здесь i будет равным 1, то и PosEx('</a', a, i + 1) и PosEx('</a', a, i) выдадут число 7 (или 8, хз), но если i будет =10, то PosEx('</a', a, i) продолжить выдавать 7(или 8), а PosEx('</a', a, i + 1) выдаст уже 18(или 19) не знаю, включительно ли считает эта функция
  36. end;//и соотвественно, когда один оператор выдаст 18, а другой будет выдавать 7, то это будет признаком нахождения другого тега (</a) и будет обозначать, что текущее значение i равно окончанию поля для ника >nickname</a(а дальше есть другой ник). Дальше эта позиция передается в функцию getName, которая возвращает ник и при помощи writeln(r,getName) записывает его в файл r
  37. close(f);//закрывает файл f, т.к. нужно будет открыть еще 8 таких же, а засорять память - неочень
  38. writeln(np);//выводит то, с каким файлом сейчас работает прога(просто выведет цифры от 1 до 8 с маленькой задержкой)
  39. l := 0;//обнуляет номер строк, т.к. в новом файле нужно заного его перебирать
  40. end;
  41. close(r);// ну и закрывает файл для записи.
  42. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement