首页 文章

Delphi:如何根据(动态)掩码将字符串动态“拆分”为子字符串

提问于
浏览
3

这是我的情况:我有一个文本文件,其中包含许多等长字符串,表示要加载到SQL DB表中的记录,所以我必须从这些字符串生成SQL代码 .
我在那个DB上有一个表(让我们称之为"formatting table")告诉我如何格式化字符串以及在何处加载它们(该表的每个记录包含目标表名,字段名,数据位置和长度,参考来自文本文件的字符串) .

我已经用一种方式解决了这个问题,我认为每个Delphi程序员都很熟悉,使用 Copy(string, pos, length) 函数并根据"formatting table"的信息迭代每个字段 .
这很有效,但速度很慢,特别是当我们谈论具有一百万或更多行的源文本文件时,每行代表几十甚至几百个数据字段 .

我现在要做的是"see"源字符串以它们看起来已经分裂的方式,避免了 Copy() 函数不断创建新字符串从原始字符串复制内容,分配和释放内存等等 . 我要说的是"I have the whole string, let's see it in a way that represent each 'piece' (field) of it in a single step, without creating substrings from it" .

什么可以解决我的问题将是某种方式来定义动态结构,如动态记录或动态数组(不是Delphy称之为动态数组,更像是“动态静态数组”)以按顺序“叠加”在字符串上从这个角度“观察”它...我不知道我对这个解释是否足够清楚......但是Delphi(据我所知)并没有实现这种动态结构 .

除了缺乏活力之外,这是一个(静态)代码,可以满足我的需求 .

procedure TForm1.FormCreate(Sender: TObject);
type
  PDecodeStr = ^TDecodeStr;
  TDecodeStr = record
    s1: Array[0..3] of AnsiChar;
    s2: Array[0..9] of AnsiChar;
    s3: Array[0..4] of AnsiChar;
    s4: Array[0..7] of AnsiChar;
    s5: Array[0..2] of AnsiChar;
  end;
var
  cWholeStr: AnsiString;
begin
  cWholeStr := '123456789012345678901234567890';
  Memo1.Lines.Add(PDecodeStr(PAnsiString(cWholeStr)).s1);
  Memo1.Lines.Add(PDecodeStr(PAnsiString(cWholeStr)).s2);
  Memo1.Lines.Add(PDecodeStr(PAnsiString(cWholeStr)).s3);
  Memo1.Lines.Add(PDecodeStr(PAnsiString(cWholeStr)).s4);
  Memo1.Lines.Add(PDecodeStr(PAnsiString(cWholeStr)).s5);
end;

有关如何解决这个问题的任何想法?

提前致谢 .

2 回答

  • 1

    你无法真正避免创建额外的字符串 . 您问题末尾的示例会创建字符串 .

    Memo1.Lines.Add(PDecodeStr(PAnsiString(cWholeStr)).s1)
    

    您在此代码中对 TStrings.Add() 的调用会从您传递的参数中隐式创建一个动态字符串,然后将此字符串传递给 Add() .

    使用 Copy 的解决方案可能是要走的路,因为如果您希望对拆分字符串执行任何操作,我看不到任何简单的方法来避免复制内存 .

  • 5

    我认为使用Delphi的方式并不比使用Copy更有效 .

    但另一种解决方案是将所有字符串直接加载到一列temporay表中,然后使用SQL查询进行溢出 . 总时间取决于很多参数,所以最好的方法是测试!!

相关问题