2

我正在使用 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;

我希望有一天有人会使用它 :) 感谢您的帮助,Gramm

4

2 回答 2

0

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

于 2009-09-23T12:20:26.347 回答
0

为了执行连续搜索,需要做两件事:

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

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

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

于 2009-09-22T14:52:36.197 回答