0

Web 上に 95000 行以上の大きなテキスト ファイルが 1 つあります。

たとえば、次のようになります。

  • 私は1本の弦を持っています
  • そのファイル内のその文字列と一致させ、その文字列がファイルに配置されている行全体を読み取りたい

ファイル全体を文字列にロードできるwininetを使用していますが、マッチング中に多くの時間がかかり、GUIがハングします

とにかくもっと速くする方法はありますか?

編集:

これは、Webからurlcontentsを取得するために使用するコードです

ボタン1で

var
s:string;

begin
  //1-  as file is big it takes alot of time :/ 
  S := GetUrlContent('web url example');
  if (Pos('string i want to search', s)> 0) then
  begin 
  mmo1.lines.add('Found');
  //2-  now how can i show extact line that contains string 
  end;
end;

//------------------------------------------------ ----

function GetUrlContent(const Url: string): string;
var
  NetHandle: HINTERNET;
  UrlHandle: HINTERNET;
  Buffer: array[0..1024] of Char;
  BytesRead: dWord;
begin
  Result := '';
  NetHandle := InternetOpen('Delphi 5.x', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

  if Assigned(NetHandle) then
  begin
    UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);

    if Assigned(UrlHandle) then
      { UrlHandle valid? Proceed with download }
    begin
      FillChar(Buffer, SizeOf(Buffer), 0);
      repeat
        Result := Result + Buffer;
        FillChar(Buffer, SizeOf(Buffer), 0);
        InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
      until BytesRead = 0;
      InternetCloseHandle(UrlHandle);
    end
    else
      { UrlHandle is not valid. Raise an exception. }
      raise Exception.CreateFmt('Cannot open URL %s', [Url]);

    InternetCloseHandle(NetHandle);
  end
  else
    { NetHandle is not valid. Raise an exception }
    raise Exception.Create('Unable to initialize');
end;
4

0 に答える 0