Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Поиск количества строк в тексте (http://forum.oszone.net/showthread.php?t=170116)

DaRiYs 14-03-2010 16:36 1368452

Поиск количества строк в тексте
 
Помогите решить такую задачю на 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 1368815

Цитата:

Цитата DaRiYs
Файл нельзя весь грузить в память а только частями или побайтно считывать »

Так частями все таки можно? А какими частями? Если можно частями, то достаточно будет выгружать в строковую переменную часть файла через тот же substring, а потом искать вхождения?

Serega 15-03-2010 16:24 1369224

Цитата:

Цитата DaRiYs
нужно подсчитать сколько раз встречается заданная строка в какомто файле. Файл нельзя весь грузить в память а только частями или побайтно считывать »

Честно сказать 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#.


Время: 10:17.

Время: 10:17.
© OSzone.net 2001-