Delphi函数将字符串转换为DOS格式

时间:2009-09-22 14:04:12

标签: delphi string format dos

我正在使用FINDSTR函数来过滤文本文件,但它对扩展的ASCII字符很不满意。  我尝试使用CharToOEM功能,但我仍然有'à'等字符,FINDSTR似乎无法识别。

我想使用FINDSTR,因为我使用的文本文件大100MB,所以我需要快速的东西。 是否存在一个函数,它重命名字符串,使它们没有“奇怪的”字符?

代码是:

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 :(得分:0)

为了执行连续搜索,有两件事是必要的:

  • 您必须将非unicode语言与ansi编码文件中使用的语言相匹配。如果它不是您当前的语言,请暂时更改:

    控制面板\区域和语言选项\高级\非Unicode程序的语言

  • 要执行不区分大小写的搜索,您必须在FindStr中使用/ i选项。

答案 1 :(得分:0)

为什么不在Delphi中编写代码呢?可以使用简单的文本I / O(稍微放大的文件缓冲区),或者一直使用二进制块级别访问。