繁体   English   中英

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

[英]Delphi: how to dynamically “split” a string into substrings according to a (dynamic) mask

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

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

我现在要做的是以一种它们看起来已经拆分的方式“看到”源字符串,避免连续创建新字符串的Copy()函数复制原始字符串中的内容,分配和释放内存等等上。 我所说的是“我拥有整个字符串,让我们在一个步骤中以一种代表每个'片段'(字段)的方式看待它,而不是从它创建子串”。

什么可以解决我的问题将是某种方式来定义动态结构,如动态记录或动态数组(不是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;

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

提前致谢。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM