我在TStringList类中使用分隔符时遇到问题.看一看:
var
s: string;
sl: TStringList;
begin
sl := TStringList.Create;
s := 'Users^foo bar^bar foo^foobar^barfoo';
sl.Delimiter := '^';
sl.DelimitedText := s;
ShowMessage(sl[1]);
end;
Run Code Online (Sandbox Code Playgroud)
sl[1] 应该回来 'foo bar'
sl[1] 回来了 'foo'
看来分隔符现在是'^'AND' '
有任何想法吗?
为什么变量被声明为TStrings和创建为TStringList?
例如:var sl声明为,TStrings但创建为TStringList
var
sl : TStrings;
begin
sl := TStringList.Create;
// add string values...
sl.Add( 'Delphi' );
sl.Add( '2.01' );
// get string value using its index
// sl.Strings( 0 ) will return
// 'Delphi'
MessageDlg(
sl.Strings[ 0 ],
mtInformation, [mbOk], 0 );
sl.Free;
end;
Run Code Online (Sandbox Code Playgroud) 最近我被一位声誉卓着的SO用户告知,它TStringList有分裂错误,导致它无法解析CSV数据.我没有被告知这些错误的性质,在互联网上搜索包括Quality Central没有产生任何结果,所以我问.什么是TStringList拆分错误?
请注意,我对没有根据意见的答案感兴趣.
我知道的:
并不多......其中一个就是,这些错误很少出现在测试数据中,但在现实世界中却很少见.
另一方面,如上所述,它们阻止了对CSV的正确解析.认为很难用测试数据重现错误,我(可能)寻求帮助,他们尝试在生产代码中使用字符串列表作为CSV解析器.
无关紧要的问题:
我获取了有关'Delphi-XE'标记问题的信息,因此由于"空格字符被视为分隔符" 功能而无法解析,因此不适用.因为StrictDelimiterDelphi 2006 引入的属性解决了这个问题.我,我自己,正在使用Delphi 2007.
此外,由于字符串列表只能包含字符串,因此它只负责拆分字段.涉及由区域差异等引起的字段值(fi日期,浮点数......)的任何转换难度都不在范围内.
基本规则:
CSV没有标准规范.但是从各种规范中可以推断出基本规则.
下面演示TStringList如何处理这些.规则和示例字符串来自维基百科.括号([ ])叠加在字符串周围,以便能够通过测试代码查看前导或尾随空格(相关).
空间被认为是一个领域的一部分,不应该被忽视.
Test string: [1997, Ford , E350] Items: [1997] [ Ford ] [ E350]
带嵌入逗号的字段必须包含在双引号字符中.
Test string: [1997,Ford,E350,"Super, luxurious truck"] Items: [1997] [Ford] [E350] [Super, luxurious truck]
具有嵌入式双引号字符的字段必须包含在双引号字符中,并且每个嵌入的双引号字符必须由一对双引号字符表示.
Test string: [1997,Ford,E350,"Super, ""luxurious"" truck"] Items: [1997] [Ford] [E350] [Super, "luxurious" truck]
嵌入换行符的字段必须包含在双引号字符中.
Test string: [1997,Ford,E350,"Go get one …
使用标准有什么不同
type
sl: TStringList
Run Code Online (Sandbox Code Playgroud)
与使用通用TList相比
type
sl: TList<string>
Run Code Online (Sandbox Code Playgroud)
?
据我所知,两者表现完全相同.
这只是做同样事情的另一种方式吗?
是否存在一个比另一个好的情况?
谢谢!
为什么要Memo.Lines使用抽象类TStrings?为什么不使用TStringList呢?
我应该TStringList在使用它之前将其转换为它吗?
在delphi中有一种简单的方法可以将字符串数组转换为tstringlist吗?
我有一个简单的TStringList.我做了一个TStringList.Sort.
然后我注意到下划线"_"在大写字母"A"之前排序.这与排序相同文本并在A之后排序_的第三方软件包形成对比.
根据ANSI字符集,AZ是字符65 - 90,_是95.所以看起来第三方包使用该顺序而TStringList.Sort不是.
我深入研究了TStringList.Sort的内容,并使用AnsiCompareStr(Case Sensitive)或AnsiCompareText(Case Insensitive)进行排序.我尝试了两种方法,将我的StringList的CaseSensitive值设置为true,然后设置为false.但在这两种情况下,"_"首先排序.
我无法想象这是TStringList中的一个错误.所以这里肯定有其他东西我没有看到.可能是什么?
我真正需要知道的是如何让我的TStringList进行排序,使其与其他包的顺序相同.
作为参考,我使用Delphi 2009,我在我的程序中使用Unicode字符串.
所以这里的最终答案是覆盖Ansi与你想要的任何东西比较(例如非ansi比较),如下所示:
type
TMyStringList = class(TStringList)
protected
function CompareStrings(const S1, S2: string): Integer; override;
end;
function TMyStringList.CompareStrings(const S1, S2: string): Integer;
begin
if CaseSensitive then
Result := CompareStr(S1, S2)
else
Result := CompareText(S1, S2);
end;
Run Code Online (Sandbox Code Playgroud) 使用delphi 7:
AddObject?将一个整数添加到stringlist项的对象部分?我有一个存储在TStringList中的字符串列表,我想将其转换为由逗号分隔的字符串,我使用以下代码
channelList: TStringList;
aCurrentChannel := Stringreplace(channelList.Text,Char(13)+Char(10),',',[rfReplaceAll]);
Run Code Online (Sandbox Code Playgroud)
但最后一个角色来了,就像1,2,无论如何都要避免这种情况?
我正在解析数据集并为TStringList我想要避免重复项分配值.我使用以下代码但仍插入重复项.
channelList := TStringList.Create;
channelList.Duplicates := dupIgnore;
try
dataset.First;
while not dataset.EOF do
begin
channelList.Add(dataset.FieldByName('CHANNEL_INT').AsString) ;
dataset.Next;
end;
Run Code Online (Sandbox Code Playgroud)
为什么要添加重复项?