Войти

Показать полную графическую версию : Поиск количества строк в тексте


DaRiYs
14-03-2010, 16:36
Помогите решить такую задачю на C#. Вобщем нужно подсчитать сколько раз встречается заданная строка в какомто файле. Файл нельзя весь грузить в память а только частями или побайтно считывать. Я вроде написал функцию, но проблемма в том что файл читается очень медленно, и поиск не оптимальный. Как решить все это?


while(FileRead.Position<FileRead.Length)
{
bool flag = false;
char ch=Convert.ToChar(FileRead.ReadByte());
if (ch == SearchRequest[0])
{
for (int i = 1; i < SearchRequest.Length &&
FileRead.Position < FileRead.Length; i++)
if (SearchRequest[i] != Convert.ToChar(FileRead.ReadByte()))
{
flag = true;
break;
}
}
else
flag=true;

if(!flag)
CounterFind++;
}

Delirium
15-03-2010, 01:40
Файл нельзя весь грузить в память а только частями или побайтно считывать »
Так частями все таки можно? А какими частями? Если можно частями, то достаточно будет выгружать в строковую переменную часть файла через тот же substring, а потом искать вхождения?

Serega
15-03-2010, 16:24
нужно подсчитать сколько раз встречается заданная строка в какомто файле. Файл нельзя весь грузить в память а только частями или побайтно считывать »
Честно сказать C# не знаю, но на Делфи, я бы сделал таким образом:

function SearchSubString(const FileName, SearchString: string): Integer;
var
txt: TextFile;
s: string;
count: Integer;
begin
count:= 0;
try
AssignFile(txt, FileName);
Reset(txt);
while not Eof(txt) do
begin
Readln(txt, s);
while Pos(SearchString, s) > 0 do
begin
Delete(s, 1, Pos(SearchString, s) + Length(SearchString));
Inc(count);
end;
end;
Result:= count;
finally
CloseFile(txt);
end;
end;

// Пример использования: SearchSubString('C:\Test.txt', 'Hallo world!!!');
// В результате, фукция вернёт количество Hallo world!!! в файле C:\Test.txt

Функция работает очень быстро, надеюсь, что-то похожее можно и на C#.




© OSzone.net 2001-2012