2009-09-22 71 views
2

我使用FINDSTR功能来过滤的文本文件,但它failling上扩展ASCII字符。 我尝试过使用CharToOEM函数,但我仍然有像'à'这样的字符,FINDSTR似乎没有识别。德尔福函数将字符串转换为DOS格式

我想使用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无法找到文件... 编辑:这是2007年德尔福

编辑:我想用像循环:不幸的是,我找不到这样的“strContains”函数(它可能会很慢)。搜索字符串是没有什么复杂的,这是一帮十六进制值:“C2 | 1AF | B8 | ...”

最后编辑: 有时候最好还是回到基本:) 我刚刚更换所有的扩展字符由下划线通过测试字符值:

for I := 1 to length(lASCFileNameFull) do begin 
    if integer(lASCFileNameFull[i])>127 then 
    lASCFileNameFull[i]:='_'; 
end; 

我希望有人会用这一天:) 感谢您的帮助, 格拉姆

+1

您需要添加'Si.cb:=中SizeOf(TStartupInfo);'你的代码,否则整个'的CreateProcess()调用'可能会失败。检查结果代码! – mghie 2009-09-22 14:31:17

+0

增加了行:) – gramm 2009-09-22 15:05:51

回答

0

为了执行搜索接连两件事情是必要的:

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

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

  • 来执行,你必须使用不区分大小写的搜索/我的选项FINDSTR。

+0

使用软件的时候:)我不能要求每个用户更改其区域设置。 区分大小写的搜索不是问题,因为这些文件格式良好(除文件名外) – gramm 2009-09-22 15:05:09

0

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