Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];

Вниз

Поиск в файлах   Найти похожие ветки 

 
vlv   (2003-11-29 20:52) [0]

Есть ли какие-нибудь стандартные решения для поиска строки в файлах (в указанной директории)?


 
Anatoly Podgoretsky   (2003-11-29 21:09) [1]

Да, Win+F/Ctrl+F


 
me   (2003-11-29 21:19) [2]

Microsoft Indexing Server


 
vlv   (2003-12-01 16:08) [3]

=)) Ctrl+F - это прикольно.
Имелось в виду вызвать из кода программы.


 
Clift   (2003-12-01 16:18) [4]

я так делал
если нужно найти строку "qwe"
str:="dddddd qwe dddddd";
if pos("q" str)<>0 then
begin
if pos("w",str)=pos("q", str)+1 then
begin
if pos("e")=pos("q",str)+2 then такая строка есть.....
end;
end;
уверен что есть другой способ но и этот работает


 
Anatoly Podgoretsky   (2003-12-01 16:20) [5]

Если стандартные решения и в программе, то смотри местный чаво


 
Eugene1501   (2003-12-01 19:02) [6]

То Clift А чем тебе так не понравилось?

if pos("qwe",str)<>0 then такая строка есть.....


 
zapped   (2003-12-02 02:44) [7]

а кто-нибудь думал над тем, что в общем случае в файле могут содержаться нулевые символы?


 
panov   (2003-12-02 09:33) [8]

>zapped © (02.12.03 02:44) [7]

а кто-нибудь думал над тем, что в общем случае в файле могут содержаться нулевые символы?

А зачем?
Для Pos совершенно без разницы, есть нулевой символ или нет.


 
Anatoly Podgoretsky   (2003-12-02 09:37) [9]

zapped © (02.12.03 02:44) [7]
Ну думали, ну и что, правильнее думать, что в файле могут встретиься все допустимые комбинации символов, от 0 до 255. Но зачем тогда говорить о строках? Говорить тогда надо о поиске вдоичных данных. Pos с ними тоже справляется.


 
alena.svt   (2003-12-02 10:12) [10]

Function ScanFile( Const filename: String;
Const forString: String;
caseSensitive: Boolean ): LongInt;
{ returns position of string in file or -1, if not found }
Const
BufferSize= $8001; { 32K+1 bytes }
Var
pBuf, pEnd, pScan, pPos : Pchar;
filesize: LongInt;
bytesRemaining: LongInt;
bytesToRead: Word;
F : File;
SearchFor: Pchar;
oldMode: Word;
Begin
Result := -1; { assume failure }
If (Length( forString ) = 0) or (Length( filename ) = 0) Then Exit;
SearchFor := Nil;
pBuf := Nil;

{ open file as binary, 1 byte recordsize }
AssignFile( F, filename );
oldMode := FileMode;
FileMode := 0; { read-only access }
Reset( F, 1 );
FileMode := oldMode;
try { allocate memory for buffer and pchar search string }
SearchFor := StrAlloc( Length( forString )+1 );
StrPCopy( SearchFor, forString );
If not caseSensitive Then { convert to upper case }
AnsiUpper( SearchFor );
GetMem( pBuf, BufferSize );
filesize := System.Filesize( F );
bytesRemaining := filesize;
pPos := Nil;
While bytesRemaining > 0 Do Begin
{ calc how many bytes to read this round }
If bytesRemaining >= BufferSize Then
bytesToRead := Pred( BufferSize )
Else
bytesToRead := bytesRemaining;

{ read a buffer full and zero-terminate the buffer }
BlockRead( F, pBuf^, bytesToRead, bytesToRead );
pEnd := @pBuf[ bytesToRead ];
pEnd^:= #0;
{ scan the buffer. Problem: buffer may contain #0 chars! So we
treat it as a concatenation of zero-terminated strings. }
pScan := pBuf;
While pScan < pEnd Do Begin
If not caseSensitive Then { convert to upper case }
AnsiUpper( pScan );
pPos := StrPos( pScan, SearchFor ); { search for substring }
If pPos <> Nil Then Begin { Found it! }
Result := FileSize - bytesRemaining +
LongInt( pPos ) - LongInt( pBuf );
Break;
End;
pScan := StrEnd( pScan );
Inc( pScan );
End;
If pPos <> Nil Then Break;
bytesRemaining := bytesRemaining - bytesToRead;
If bytesRemaining > 0 Then Begin
{ no luck in this buffers load. We need to handle the case of
the search string spanning two chunks of file now. We simply
go back a bit in the file and read from there, thus inspecting
some characters twice
}
Seek( F, FilePos(F)-Length( forString ));
bytesRemaining := bytesRemaining + Length( forString );
End;
End; { While }
finally
CloseFile( F );
If SearchFor <> Nil Then StrDispose( SearchFor );
If pBuf <> Nil Then FreeMem( pBuf, BufferSize );
end;
end; { ScanFile }

Peter Below (TeamB) 100113.1101@compuserve.com)
No e-mail responses, please, unless explicitly requested!



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
3-36558
The
2003-11-20 10:52
2003.12.12
Помогите составить запрос


3-36516
Sharkkk
2003-11-21 21:59
2003.12.12
Подскажите, как лучше отображать многоуровневый справочник...


7-36859
PaveL777
2003-09-02 04:27
2003.12.12
Температура процессора


4-36900
destroer
2003-10-16 14:25
2003.12.12
Сбор данных о компьютере


6-36786
Pepperok
2003-10-15 14:27
2003.12.12
Как отловить сообщения приходящие на службу сообщений(Net send)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский