Я использую функцию FINDSTR для фильтрации текстовых файлов, но она не подходит для расширенных символов ASCII.
Я попытался использовать функцию CharToOEM, но у меня все еще есть такие символы, как 'à', которые FINDSTR, похоже, не распознает.
Я хочу использовать FINDSTR, потому что текстовые файлы, с которыми я работаю, имеют размер 100 МБ, поэтому мне нужно что-то быстрое.
Существует ли функция, которая переименовывает строки, чтобы у них не было «странных» символов?
Код:
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" (и она, вероятно, будет медленной). Строка поиска ничего сложного, это набор значений HEX: "C2 | 1AF | B8 | ..."
Окончательное редактирование:
Иногда лучше вернуться к основам :)
Я просто заменяю все расширенные символы подчеркиванием, проверяя значение символа:
for I := 1 to length(lASCFileNameFull) do begin
if integer(lASCFileNameFull[i])>127 then
lASCFileNameFull[i]:='_';
end;
Надеюсь, кто-нибудь когда-нибудь воспользуется этим :)
Спасибо за помощь,
Грамм