标签: tstringlist

如何更快地搜索Delphi TStringList中的名称/值对?

我通过在运行时将所有字符串放在TStringList中来实现应用程序中的语言转换:

procedure PopulateStringList;
begin  
  EnglishStringList.Append('CAN_T_FIND_FILE=It is not possible to find the file');
  EnglishStringList.Append('DUMMY=Just a dummy record');
  // total of 2000 record appended in the same way
  EnglishStringList.Sorted := True; // Updated comment: this is USELESS!
end;
Run Code Online (Sandbox Code Playgroud)

然后我使用以下方式获得翻译:

function GetTranslation(ResStr:String):String;
var
  iIndex : Integer;
begin
  iIndex := -1;
  iIndex :=  EnglishStringList.IndexOfName(ResStr);
  if iIndex >= 0 then
  Result :=  EnglishStringList.ValueFromIndex[iIndex] else
  Result := ResStr + ' (Translation N/A)';
end;
Run Code Online (Sandbox Code Playgroud)

无论如何使用这种方法找到一条记录需要大约30微秒,是否有更好的方法来实现相同的结果?

更新:为了将来的参考,我在这里写了建议使用TDictionary的新实现(适用于Delphi 2009及更新版本):

procedure PopulateStringList;
begin  
  EnglishDictionary := TDictionary<String, String>.Create;
  EnglishDictionary.Add('CAN_T_FIND_FILE','It is …
Run Code Online (Sandbox Code Playgroud)

delphi tstringlist

6
推荐指数
3
解决办法
1万
查看次数

如果对列表进行排序,为什么Delphi的TStringList.InsertObject()方法抛出异常?

在Delphi 6中,如果您尝试将对象插入到已排序的TStringList(Sorted = true),则会抛出异常,警告您在排序列表上不允许使用InsertObject().如果调用InsertObject()必然意味着破坏列表的Sorted顺序,我可以理解这一点.但鉴于TStringList.Find()方法:

function TStringList.Find(const S: string; var Index: Integer): Boolean;
Run Code Online (Sandbox Code Playgroud)

返回一个索引,告诉你如果给定字符串添加到列表中的插入索引应该是什么,使用该索引调用InsertObject()应该在操作后保持排序列表仍然按排序顺序.我已经检查了TStringList的Delphi源代码,它似乎证实了我的断言.

现在我只是为TStringList创建一个新的子类,它覆盖了InsertObject(),并且如果在排序列表中调用了InsertObject(),则不会抛出异常,但我想确保没有一些隐藏的危险我我只是没有看到.

- roschler

delphi exception sorted tstringlist sortedlist

6
推荐指数
1
解决办法
1163
查看次数

从TStringList中删除字符串

我有一个列表框或列表视图与项目.我有一个字符串列表与列表框/列表视图相同的项目(字符串).我想从字符串列表中删除列表框/列表视图中的所有选定项目.

怎么做?

for i:=0 to ListBox.Count-1 do
  if ListBox.Selected[i] then
    StringList1.Delete(i); // I cannot know exactly an index, other strings move up
Run Code Online (Sandbox Code Playgroud)

delphi string tstringlist

6
推荐指数
4
解决办法
2万
查看次数

Delphi:为什么TStringlist不能在程序中分配?

第一个程序:

procedure TestOne(List : TStringList);
var
  TempList : TStringList;
begin
  TempList := TStringList.Create;
  TempList.Add('Test');
  List := TempList;
  TempList.Free;
end;

procedure TForm1.Button1Click(Sender : TObject);
var
  aList : TStringList;
begin
  aList := TStringList.Create;
  TestOne(aList);
  Memo1.Lines := aList;
end;
Run Code Online (Sandbox Code Playgroud)

当我单击按钮时,备忘录不显示任何内容,并且断点显示该过程不执行此行:

  List := TempList;
Run Code Online (Sandbox Code Playgroud)

这条线

我修改了程序:

procedure TestTwo(List : TStringList);
var
  TempList : TStringList;
begin
  TempList := TStringList.Create;
  TempList.Add('Test');
  List.Text := TempList.Text;
  //or
  List.Assign(TempList);
  //List := TempList;
  TempList.Free;
end;
Run Code Online (Sandbox Code Playgroud)

这次它有效.

那么为什么它不能使用List := TempList;

delphi tstringlist

6
推荐指数
1
解决办法
4778
查看次数

将数百万条记录加载到字符串列表中可能会非常慢

我如何能够非常快速地将数百万条记录从tadotable加载到stringlist中?

procedure TForm1.SlowLoadingIntoStringList(StringList: TStringList);
begin
  StringList.Clear;
  with SourceTable do
  begin
    Open;
    DisableControls;
    try
      while not EOF do
    begin
      StringList.Add(FieldByName('OriginalData').AsString);
      Next;
    end;
   finally
   EnableControls;
   Close;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

delphi tstringlist tadotable

5
推荐指数
2
解决办法
3175
查看次数

在TStringList中添加多个分隔符

这是我的分隔文本:$ HEHDT,10.17,T*28 $ HEHDT,10.18,T*2A等......

逗号是我的句子分隔符.但是,我也希望使用星号作为我的分隔符.

我想要实现的输出是:

$ HEHDT 10.17 T 28 $ HEHDT 10.18 T 2A

如何在delphi中指定多个句子分隔符?这是我到目前为止的代码.

var
  MyStringList: TStringList;
  i: Integer;
begin
  MyStringList:= TStringList.Create;

  MyStringList.Delimiter := ','
  MyStringList.DelimitedText := '$HEHDT,10.17,T*28'+#13#10 +'$HEHDT,10.18,T*2A' +#13#10;

  for i= 0 to MyStringList.Count-1 do
    ShowMessage(MyStringList[i]);

  MyStringList.Free;
end;
Run Code Online (Sandbox Code Playgroud)

对于上面的代码,它只将逗号作为分隔符.如何包括2个分隔符,包括逗号和星号?

提前谢谢了!=)

delphi tstringlist delimiter

5
推荐指数
1
解决办法
2852
查看次数

在Delphi TStringList中分割文本的更快捷方式

我有一个需要在TStringList中进行大量文本操作的应用程序.基本上我需要用分隔符分割文本; 例如,如果我有一个带有1000个字符的单行,并且此分隔符在此行中出现3次,那么我需要将其拆分为3行.分隔符可以包含多个char,例如,它可以是"[test]"之类的标记.

我用两种不同的方法编写了两个函数来完成这个任务,但是大量的文本都很慢(通常超过2个字节).

我怎样才能更快地实现这一目标?

这两个函数都接收2个参数:'lines'是原始的tstringlist,'q'是分隔符.

function splitlines(lines : tstringlist; q: string) : integer;
var
  s, aux, ant : string;
  i,j : integer;
  flag : boolean;
  m2 : tstringlist;
begin
  try
    m2 := tstringlist.create;
    m2.BeginUpdate;
    result := 0;
    for i := 0 to lines.count-1 do
    begin
      s := lines[i];
      for j := 1 to length(s) do
      begin
        flag := lowercase(copy(s,j,length(q))) = lowercase(q);
        if flag then
        begin
          inc(result);
          m2.add(aux);
          aux := s[j];
        end
        else
          aux := aux + s[j];
      end;
      m2.add(aux);
      aux …
Run Code Online (Sandbox Code Playgroud)

delphi split tstringlist delphi-2007

5
推荐指数
1
解决办法
8722
查看次数

TStringList vs String与TArrayOfString的数组

我正在重构Inno Setup项目,对我来说不太清楚的是使用TArrayOfString,String和TStringList数组.这三种类型有什么不同?据我所知,它的使用似乎没有区别.所有三个存储字符串,我可以使用数组\列表获取存储的字符串,如下所示:arrayName[i].

当使用其中一个时,是一个更快还是被认为是错误的编码?我希望有人可以在这件事上给我带来清晰的认识.

inno-setup tstringlist

5
推荐指数
1
解决办法
4419
查看次数

如何将TStringList类中的对象保存到没有BOM的UTF8文件(Delphi XE 2)?

当我将对象从TStringList类文件内容保存到文件时,该文件默认使用UTF-8保存,但UTF-8保存为BOM.

我的代码是:

myFile := TStringList.Create;
try
  myFile.Text := myData;
  myFile.saveToFile('myfile.dat', TEncoding.UTF8)
finally
  FreeAndNil(myFile);
end;
Run Code Online (Sandbox Code Playgroud)

在示例中,文件"myfile.dat"显示为"UTF-8 BOM"编码.

如何在没有BOM的情况下保存文件?

delphi utf-8 tstringlist

5
推荐指数
2
解决办法
4903
查看次数

使用 TStreamReader 和 TStringList 处理非常大的文本文件

我正在使用 Embarcadero 的 Rad Studio Delphi (10.2.3),并且在读取非常大的文本文件(700 万行以上,每行都不同,行长度可以是 1 到 ~200 个字符等)时遇到内存问题。我对 Delphi 编程相当陌生,所以在发帖之前我已经搜索过 SO 和 Google 寻求帮助。

我最初实现了一个 TStringList 并使用 LoadFromFile 方法读取文件,但是当处理的文本文件变得足够大时,这会失败。然后,我实现了一个 TStreamReader 并使用 ReadLn 使用此处找到的基本代码填充 TStringList:

TStringList.LoadFromFile - 大文本文件的异常

代码示例:

//MyStringList.LoadFromFile(filename);
Reader := TStreamReader.Create(filename, true);
try
  MyStringList.BeginUpdate;
  try
    MyStringList.Clear;
    while not Reader.EndOfStream do
      MyStringList.Add(Reader.ReadLine);
  finally
    MyStringList.EndUpdate;
  end;
finally
  Reader.Free;
end;
Run Code Online (Sandbox Code Playgroud)

在我需要处理的文件变得巨大(约 700 万行以上)之前,这种方法一直很有效。看起来 TStringList 变得太大以至于内存不足。我说“出现”是因为我实际上无权访问正在运行的文件,并且所有错误信息都是由我的客户通过电子邮件提供的,这使得这个问题变得更加困难,因为我无法简单地在 IDE 中调试它。

该代码是32位编译的,我无法使用64位编译器。我也不能包括数据库系统之类的。不幸的是,我有一些严格的限制。我需要加载每一行以查找模式并将这些行与其他行进行比较以查找“模式中的模式”。我很抱歉在这里说得很含糊。

底线是——有没有一种方法可以在不使用 TStringList 的情况下访问文本文件中的每一行,或者也许有更好的方法来处理 TStringList 内存?

也许有一种方法可以将 StreamReader 中的特定行块加载到 TStringList 中(例如,读取前 100,000 行并处理,接下来的 100,000 行等),而不是一次加载所有内容?我想我可以写一些东西来处理可能的“块间”模式。

预先感谢您的任何和所有帮助和建议!

***** 编辑更新 *****

好的,这是我需要实现的基本解决方案:

var …
Run Code Online (Sandbox Code Playgroud)

delphi text tstringlist readline delphi-10.2-tokyo

5
推荐指数
1
解决办法
3341
查看次数