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