标签: tstringlist

随机文本文件Delphi源或其他任何东西

我有一个包含10,000个条目的字符串列表.我有一个shuffle例程,但访问任何项目需要花费很多时间.浏览所有10k项目需要花费大量时间.

我想保存它做磁盘然后使用另一种方法对文件进行洗牌.

有什么建议?

delphi performance tstringlist text-files

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

排序TStringList,排序如何工作?

我只是好奇,因为我最近看到在Java中使用Hashmaps,并想知道Delphi的Sorted String列表是否相似.

TStringList对象是否生成Hash以用作每个项的索引?如何通过Find函数根据字符串列表检查搜索字符串?

我经常使用Sorted TStringLists,我只想了解更多内容.

请假设我不知道哈希映射是如何工作的,因为我没有:)

谢谢

delphi tstringlist

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

如何在Delphi中使用稳定排序替换StringList.Sort?

我正在做一个简单的StringList.sort,但是Delphi使用的QuickTort不是一个稳定的排序,这意味着它可能会改变具有相同键的记录的相对顺序.

我需要使用稳定的排序.对我来说,实现这个最简单的方法是什么?


Mike W的答案可能是最简单的方法,无需进行太多的代码更改.

谢谢,迈克.

delphi sorting tstringlist stable-sort

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

如何在Delphi IDE中观察/检查字符串列表范围?

我经常发现自己处于调试字符串列表中正在发生的事情的情况,例如,数据正在StringList [StartOfBlock]到StringList [EndOfBlock]的范围内被操纵.我可以快速检查或观察该范围内的一个或多个变量索引,例如StringList [LineNum],但检查StartBlock/Endblock范围内的相邻字符串很麻烦.我可以在StringList [LineNum + 1]上添加另一个监视,或者在Ctrl-F7检查器中修改表达式,但这是非常多的工作;-(

我希望永久性地在IDE中的StringList [StartOfBlock]到StringList [EndOfBlock].(如果在StartOfBlock/EndOfBlock发生更改时该视图发生更改,或者该视图可以刷新,那将是非常好的.)

我将如何在IDE中构建一些东西来实现这一目标?

delphi range tstringlist

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

如何在TStringList中获取最后一个字符串

我一直在寻找如何做到这一点的日子,没有什么是我需要做的(或者我只是不明白如何实现解决方案).

我需要做的是将一个字符串(一个街道地址)解析成TStringList,然后将这些字符串从列表中设置为变量然后传递给程序的其余部分.我已经把列表运行正常了:

var
AddressList : TStringList;
i : integer;

begin
AddressList := TStringList.Create;
AddressList.Delimiter := ' ';
AddressList.DelimitedText := RawAddressStr; //RawAddressStr is parsed from another file and the string result is something like '1234 Dark Souls Lane Wyoming, MI 48419'

for i := 0 to AddressList.Count-1 do
   AddressList.Strings[i]; //Not sure what to do here
Run Code Online (Sandbox Code Playgroud)

问题是地址长度不一样.地址有时候会像'1234 Dark Souls Two Lane Wyoming ......'或'1234 Dark Lane Wyoming ......'

所以我需要能够使用这个TStringList将Zip,State和City设置为变量供以后使用.我会使用TStringList.Find,但邮政编码并不总是相同.有没有办法获得最后一个字符串,然后从那里后退?(向后退,因为一旦我获得City,状态ZIP我可以从RawAddressStr中删除它,然后将其余部分设置为地址字符串.)

谢谢.

编辑,这是我需要的代码(感谢下面的评论):AddressList:= TStringList.Create;

AddressList.Delimiter := ' ';
AddressList.DelimitedText := RawAddressStr;

for i := 0 …
Run Code Online (Sandbox Code Playgroud)

delphi string tstringlist

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

TStringList.LoadFromFile - 大文本文件的例外

我正在运行Delphi RAD Studio XE2.

我有一些非常大的文件,每个文件都包含大量的行.线条本身很小 - 只有3个标签分隔的双打.我想将文件加载到TStringList使用中,TStringList.LoadFromFile但这会引发大文件的异常.

对于200万行(约1GB)的文件,我得到了EIntOverflow例外.对于较大的文件(例如,2000万行和大约10GB),我得到了ERangeCheck例外.

我有32GB的RAM可供使用,我只是想加载这个文件并快速使用它.这里发生了什么,我有什么其他选择?我可以使用带有大缓冲区的文件流将此文件加载到TStringList中吗?如果是这样,请举一个例子.

delphi tstringlist filestream readfile delphi-xe2

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

Delphi Tstringlist,获取字符串作为带引号、逗号分隔的字符串?

我有一个 Tstringlist,其中包含数据库表中使用的键列表。我想要一种简单的方法来生成一个包含所有键的字符串,每个键用逗号分隔并用单引号引起来。这样它就可以在 SQL 'IN' 语句中使用,例如WHERE FieldX IN ('One','Two','Three')

我尝试过使用 quotechar 但在读取逗号文本时它会被忽略。例如下面的代码

procedure junk;
var
  SL : Tstringlist;
  s : string;
begin
 SL := Tstringlist.Create;
 SL.Delimiter :=','; //comma delimiter
 SL.QuoteChar := ''''; //single quote around strings
 SL.Add('One');
 SL.Add('Two');
 SL.Add('Three');
 try
   s :=  SL.commatext;
   showmessage(s);
 finally
   SL.Free;
 end; //finally
end; //junk
Run Code Online (Sandbox Code Playgroud)

显示消息一、二、三 - 不带任何引号。

我知道我可以从长远来看,就像

procedure junk;
var
  SL : Tstringlist;
  s : string;
  i : integer;
begin
 SL := Tstringlist.Create;
 SL.Delimiter :=','; //comma delimiter
 SL.Add('One');
 SL.Add('Two');
 SL.Add('Three'); …
Run Code Online (Sandbox Code Playgroud)

csv delphi tstringlist

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

TStringList线程安全吗?

没有任何形式的同步从TStringList读取数据是否可以?例如,与主线程同步.

示例代码

var MyStringList:TStringList; //declared globally

procedure TForm1.JvThread1Execute(Sender: TObject; Params: Pointer);
var x:integer;
begin

   for x:=0 to MaxInt do MyStringList.Add(FloatToStr(Random));  

end;


procedure TForm1.ButtonClick(Sender: TObject);
var x:integer;
   SumOfRandomNumbers:double;
begin

  for x:=0 to MyStringList.Count-1 do
    SumOfRandomNumbers:=SumOfRandomNumbers+StrToFloat(MyStringList.Strings[x]);

end;
Run Code Online (Sandbox Code Playgroud)

或者我应该使用EnterCiticalSection保护对MyStringList的访问

var MyStringList:TStringList; //declared globally

procedure TForm1.JvThread1Execute(Sender: TObject; Params: Pointer);
var x:integer;
begin

   for x:=0 to MaxInt do 
   begin
     EnterCriticalSection(MySemaphore); 
     MyStringList.Add(FloatToStr(Random));  
     LeaveCriticalSection(MySemaphore);
   end;

end;


procedure TForm1.ButtonClick(Sender: TObject);
var x:integer;
   SumOfRandomNumbers:double;
begin

  for x:=0 to MyStringList.Count-1 do
  begin

     EnterCriticalSection(MySemaphore);
     SumOfRandomNumbers:=SumOfRandomNumbers+StrToFloat(MyStringList.Strings[x]);
     LeaveCriticalSection(MySemaphore);

  end;

end;
Run Code Online (Sandbox Code Playgroud)

delphi multithreading tstringlist

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

TStringList局部变量未初始化为nil - 为什么?

我正在使用此代码来检查是否TStringList创建:

procedure TForm1.Button1Click(Sender: TObject);
var

  sVariable : TStringList;
begin
   if not Assigned(sVariable) then
   sVariable:= TStringList.Create;
end; 
Run Code Online (Sandbox Code Playgroud)

但条件False总是如此,为什么会发生这种情况?如何检查TStringList对象是否已创建?

Ps我知道有一个类似的问题问题,我试过在那个问题上发布的解决方案,但它对我不起作用.

delphi tstringlist delphi-7

2
推荐指数
3
解决办法
4107
查看次数

Delphi for循环和StringList错误

好的,我一直试图找出我正在制造的每一个可能的错误,但我放弃......我需要帮助!我正在写的是一个应用程序来管理我的工作租金,当日期过去时,我的应用程序从2个文本文件中删除名称.我编写了3个小函数(程序)来完成这项工作.这里:

这个从dates.dat文件加载并删除包含该员工姓名的行.

procedure remDate(emp: String);/// Removes employee from date file
var
  pos1, i: integer;
  dateList: TStringList;
begin
  dateList:=TStringList.Create;
  dateList.LoadFromFile('Data\dates.dat');
  for i:=0 to dateList.Count-1 do begin
    pos1:=AnsiPos(emp, dateList[i]);
    if pos1<>0 then begin
      dateList.Delete(i);
      dateList.SaveToFile('Data\dates.dat');
    end;
  end;
  dateList.Free;
end; //eo remDate
Run Code Online (Sandbox Code Playgroud)

这个从perm.dat文件中删除包含员工姓名的行.

procedure remPerm(emp: String);/// Removes employee from perm file
var
  pos1, i: integer;
  permList: TStringList;
begin
  permList:=TStringList.Create;
  permList.LoadFromFile('Data\perm.dat');
  for i:=0 to permList.Count-1 do begin
    pos1:=AnsiPos(emp, permList[i]);
    if pos1<>0 then begin
      permList.Delete(i);
      permList.SaveToFile('Data\perm.dat');
    end;
  end;
  permList.Free;
end; //eo remPerm
Run Code Online (Sandbox Code Playgroud)

这个把它们粘在一起.isDue是一个简单的函数,它比较2个日期,如果日期是今天或过去,则返回TRUE.

procedure updatePerms; …
Run Code Online (Sandbox Code Playgroud)

delphi for-loop tstringlist

2
推荐指数
1
解决办法
9700
查看次数