2

FINDSTR 関数を使用してテキスト ファイルをフィルター処理していますが、拡張 ASCII 文字では機能しません。CharToOEM 関数を使用してみましたが、まだ 'à' などの文字があり、FINDSTR が認識していないようです。

使用するテキスト ファイルのサイズが 100 MB であるため、FINDSTR を使用したいので、高速なファイルが必要です。「奇妙な」文字がないように文字列の名前を変更する関数は存在しますか?

コードは次のとおりです。

CharToOEM(PChar(lASCFileNameFull),PChar(lASCFileNameFull));
    renameFile(Format('%s.bak',[lASCFileNameFullBak]),Format('%s.bak',[lASCFileNameFull]));

    Si.dwFlags:=STARTF_USESHOWWINDOW;
    Si.wShowWindow:=SW_SHOWNORMAL;

    SetFileApisToOEM;
    CreateProcess(nil,pchar(Format('cmd.exe /K echo on && echo Processing filter...&& findstr "%s" %s.bak > %s',[commandString,lASCFileNameFull,lASCFileNameFull])),nil,nil,True,
    0,nil,nil,Si,Pi);
    WaitForSingleObject(pi.hProcess,INFINITE);
    SetFileApisToANSI;

残念ながら、FINDSTR はファイルを見つけることができません... 編集: これは Delphi 2007 です。

編集:次のようなループを使用することを考えました:

while(!eof) do begin
  readLN(mySrcFile, currentLine);
  if strContains(currentLine, searchSyntax) then
    writeLN(destFile,currentLine);
end;

残念ながら、そのような「strContains」関数は見つかりません (おそらく遅いでしょう)。検索文字列は複雑ではありません。「C2 | 1AF | B8 | ...」という 16 進数値の集まりです。

最終編集:基本に戻る方が良い場合もあります:)文字値をテストして、すべての拡張文字をアンダースコアに置き換えるだけです:

for I := 1 to length(lASCFileNameFull) do begin
  if integer(lASCFileNameFull[i])>127 then
    lASCFileNameFull[i]:='_';
end;

いつか誰かがこれを使ってくれることを願っています:)助けてくれてありがとう、Gramm

4

2 に答える 2

0

連続検索を実行するには、次の 2 つのことが必要です。

  • 非 Unicode 言語を ansi エンコード ファイルで使用されている言語と一致させる必要があります。現在の言語でない場合は、一時的に変更します。

    コントロール パネル\地域と言語のオプション\詳細設定\非 Unicode プログラムの言語

  • 大文字と小文字を区別しない検索を実行するには、FindStr で /i オプションを使用する必要があります。

于 2009-09-22T14:52:36.197 に答える
0

Delphiで簡単にコーディングしてみませんか?単純なテキスト I/O (ファイル バッファを少し拡大) を使用するか、バイナリ ブロック レベルのアクセスを試すことができます。

于 2009-09-23T12:20:26.347 に答える