我正在使用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;
我希望有一天会有人使用这个:) 谢谢您的帮助, 格拉姆
答案 0 :(得分:0)
为了执行连续搜索,有两件事是必要的:
您必须将非unicode语言与ansi编码文件中使用的语言相匹配。如果它不是您当前的语言,请暂时更改:
控制面板\区域和语言选项\高级\非Unicode程序的语言
要执行不区分大小写的搜索,您必须在FindStr中使用/ i选项。
答案 1 :(得分:0)
为什么不在Delphi中编写代码呢?可以使用简单的文本I / O(稍微放大的文件缓冲区),或者一直使用二进制块级别访问。