Delphi:如何根据(动态)掩码将字符串动态 "split"转换为子字符串

标签 delphi string pascal

这是我的情况:我有一个文本文件,其中包含许多等长字符串,表示要加载到 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:如何根据(动态)掩码将字符串动态 "split"转换为子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5593344/

相关文章:

delphi - 为什么 Delphi 进度条会增加迭代过程的执行时间?

delphi - 确定 TIBTransaction 是否有挂起的更改

文件中的 Python 行?

delphi-7 - 缺少@InitializeRecord

arrays - 如何使动态数组常量?

multithreading - 有没有办法给外部线程命名?

sql-server - 获取连接用户的真实身份

python - Pandas Dataframe 的子集,由具有特定列值的行组成

string - 简单的 Haskell 字符串管理

oop - Oberon 的面向对象模型与标准 OOP 有何不同?