Функция Delphi для преобразования строки в формат DOS - PullRequest
2 голосов
/ 22 сентября 2009

Я использую функцию 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;

Надеюсь, кто-нибудь когда-нибудь воспользуется этим :) Спасибо за помощь, Грамм

Ответы [ 2 ]

0 голосов
/ 23 сентября 2009

Почему бы вам не написать это просто в Delphi? Можно использовать простой текстовый ввод-вывод (с немного увеличенным буфером файлов) или пройти весь путь и попробовать доступ на уровне двоичного блока.

0 голосов
/ 22 сентября 2009

Для последовательного поиска необходимы две вещи:

  • Вы должны сопоставить язык, не относящийся к Юникоду, с языком, используемым в файле ANSI-кодирования Если это не ваш текущий язык, измените его временно:

    Панель управления \ Региональные и языковые параметры \ Дополнительно \ Язык для программ, не поддерживающих Юникод

  • , чтобы выполнить поиск без учета регистра, вы должны использовать параметр / i в FindStr.

...