【问题标题】:Delphi function to convert a string to DOS formatDelphi函数将字符串转换为DOS格式
【发布时间】:2009-09-22 14:04:12
【问题描述】:

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

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

【问题讨论】:

  • 您需要将Si.cb := SizeOf(TStartupInfo); 添加到您的代码中,否则整个CreateProcess() 调用可能会失败。检查结果代码!

标签: delphi string format dos


【解决方案1】:

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

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

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

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

【讨论】:

  • 我不能要求每个用户在使用软件时更改他们的区域设置:)。区分大小写的搜索不是问题,因为文件格式正确(好吧,除了文件名)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 2017-02-07
    • 2022-09-21
    • 1970-01-01
    相关资源
    最近更新 更多