这是我的情况:我有一个文本文件,其中包含许多等长字符串,表示要加载到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 回答
你无法真正避免创建额外的字符串 . 您问题末尾的示例会创建字符串 .
您在此代码中对
TStrings.Add()
的调用会从您传递的参数中隐式创建一个动态字符串,然后将此字符串传递给Add()
.使用
Copy
的解决方案可能是要走的路,因为如果您希望对拆分字符串执行任何操作,我看不到任何简单的方法来避免复制内存 .我认为使用Delphi的方式并不比使用Copy更有效 .
但另一种解决方案是将所有字符串直接加载到一列temporay表中,然后使用SQL查询进行溢出 . 总时间取决于很多参数,所以最好的方法是测试!!