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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2007, 15:10   #1
Uomo
Пользователь
 
Регистрация: 24.10.2007
Сообщений: 19
По умолчанию Поиск символов в текстовом файле.

Возникла проблемма с поиском определенных символов в текстовом файле.
Например есть такой файл:
<head>
<title>Delphi Sources | Программирование на Delphi - Исходники, компоненты, статьи, форум, чат, примеры, решения, учебники, справочники, FAQ</title>
<meta name="keywords" content="добавить исходник, сайт, delphi, исходник, статьи, коллекция исходников, программы, программу, новости, вопрос, программирование, форум, чат, большое количество, программ, написанных, адрес, проблема, форум, ответ, вопрос, faq">
<meta name="description" content="Delphi Sources - сайт с исходниками и документацией по Delphi">
<meta http-equiv="Content-Language" content="ru">
<meta name="author" content="Andrey Simagin">
<meta name="copyright" content="© 2007 DS">
<meta name="verify-v1" content="5s9HdOqV809PPXrDQnHsNYVi9l XCQBGMCdAKRBQI6dw=" />
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<link href="http://www.delphisources.ru/images/fon/favicon.ico" rel="shortcut icon">
<link href="pages/scripts/mystyle.css" type=text/css rel=stylesheet>

Из него нужно выбрать символы которые идут после "meta name" и скопировать в другой файл.
Не подскажите с помощью чего это можно было бы сделать.
Пробовал функцию AnsiContainsStr, но при ее использовании пишет, что переменная не определена.
Uomo вне форума Ответить с цитированием
Старый 24.10.2007, 15:13   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

регекспом или pos-ом
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 24.10.2007, 15:33   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Просто и наглядно:
Поскольку "meta name" всегда в начале стpоки, то:
Код:
//somestring - анализируемая строка, первый полезный символ - 12-й
tmpstring:='';
for i:=1 to 11 do
tmpstring:=tmpstring+somestring[i];
if tmpstring='<meta name=' then
begin
resultstring:='';
for i:=12 to Length.somestring do
resultstring:=resultstring+somestring[i];
Ну вот, выбрали. Теперь копируйте...
mihali4 вне форума Ответить с цитированием
Старый 24.10.2007, 15:36   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
всегда в начале стpоки
Ой ли? А пробелы впереди быть не могут? Случайно так...
Помоему всетки луче Pos... Надежнее как-то...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.10.2007, 15:37   #5
Uomo
Пользователь
 
Регистрация: 24.10.2007
Сообщений: 19
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Просто и наглядно:
Поскольку "meta name" всегда в начале стpоки, то:
Код:
//somestring - анализируемая строка, первый полезный символ - 12-й
tmpstring:='';
for i:=1 to 11 do
tmpstring:=tmpstring+somestring[i];
if tmpstring='<meta name=' then
begin
resultstring:='';
for i:=12 to Length.somestring do
resultstring:=resultstring+somestring[i];
Ну вот, выбрали. Теперь копируйте...
Спасибо за наглядный код, но к сожалению Stilet действительно оказался прав, не всегда в начале строки =)
Uomo вне форума Ответить с цитированием
Старый 24.10.2007, 15:42   #6
Uomo
Пользователь
 
Регистрация: 24.10.2007
Сообщений: 19
По умолчанию

procedure TFindText.Button2Click(Sender: TObject);
var
haystack : AnsiString;
begin
f:= TStringList.Create();
f.LoadFromFile('d:\log.txt'); // Загружаю текстовый файл
j:= 0;
for i:=0 to f.Count-1 do // Запускаю цикл
begin // Начало для цикла
haystack:= f.Strings[I];
if AnsiPos(haystack, 'Sum') = 0 then
begin
ShowMessage(haystack);
j:= 1;
end
else
Application.MessageBox('Строка найдена',
'Поиск закончен', MB_OKCANCEL)
end;
if j= 1 then
Application.MessageBox('Строка не найдена',
'Поиск закончен', MB_OKCANCEL);

f.Free;
end;

end.

я попробовал написать вот такой код, но "meta name" почему то не находится. mihali4 спасибо, про совет с кодировкой

Последний раз редактировалось Uomo; 24.10.2007 в 15:49.
Uomo вне форума Ответить с цитированием
Старый 24.10.2007, 15:43   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ой ли? А пробелы впереди быть не могут? Случайно так...
Помоему всетки луче Pos... Надежнее как-то...
Не надо так плохо думать о человеке... Я думаю, он уже догадался использовать TRIM...
Еще раз повторюсь - задача не в том, чтобы дать абсолютно готовое решение, а в том, чтобы подтолкнуть человека в правильном направлении. А самостоятельно достигнув цели, он и поблагодарит, и удовольствие испытает...
Цитата:
Извиняюсь, что русская кодировка поплыла..
Чтобы этого избежать, переключайтесь на русскую раскладку в том приложении, откуда собираетесь копировать текст...

Последний раз редактировалось mihali4; 24.10.2007 в 15:46.
mihali4 вне форума Ответить с цитированием
Старый 24.10.2007, 15:56   #8
Maslan
Форумчанин
 
Регистрация: 15.10.2007
Сообщений: 147
По умолчанию

Попробуй так:
(пробелы и прочую гадость убирает, но и работает дольше (на объёмах html - не важно)
Код:
Var  S,D:TStrings;
T,R:String;
Begin
 S:=TStringlist.Create;
 D:=TStringlist.Create;
 D.Clear;
 S.LoadFromFile('X:\путь\файл.html');
 R:=S.Text;
 Delete(R,1,Pos('<meta',R)-1);
 While Pos('<meta',R)>0 do
  begin
    T:=Copy(R,Pos('<meta',R)+5,Pos('>',R)-6);
    D.Add(T);
    Delete(R,1,Pos('>',R));
    Delete(R,1,Pos('<meta',R)-1);
  end;
  D.SaveToFile('X:\путь\отчёт.txt');
end;
Maslan вне форума Ответить с цитированием
Старый 24.10.2007, 15:57   #9
Uomo
Пользователь
 
Регистрация: 24.10.2007
Сообщений: 19
По умолчанию

Извините, что взрывал вам мозг, я нашел ошибку в коде.
AnsiPos(haystack, 'Sum') - неверно, получалось я искал строку haystack в строке Sum, ну и естественно не находил.
Большое спасибо, кто помог мне в решении этого вопроса.
Uomo вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск определённого текста в текстовом файле vitawt Общие вопросы Delphi 4 20.01.2008 22:12
Поиск чисел в текстовом файле Homka Паскаль, Turbo Pascal, PascalABC.NET 4 25.06.2007 19:15
Поиск данных в текстовом файле BizON Помощь студентам 1 06.06.2007 18:17