【问题标题】:How to get last string in TStringList如何获取 TStringList 中的最后一个字符串
【发布时间】:2014-09-23 20:00:19
【问题描述】:

我一直在寻找如何做到这一点,但没有什么是我真正需要做的(或者我只是不明白如何实施解决方案)。

我需要做的是将一个字符串(街道地址)解析为 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

问题在于地址并不总是相同的长度。地址有时会像“1234 Dark Souls Two Lane Wyoming...”或“1234 Dark Lane Wyoming...”

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

谢谢。

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

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

for i := 0 to AddressList.Count-1 do
  LastIndex := AddressList.Count - 1;
  ZipStr := AddressList[LastIndex];
  StateStr := AddressList[LastIndex - 1];
  CityStr := AddressList[LastIndex - 2];

现在我可以将它们与 StringReplace 一起使用,从完整的地址字符串中取出 City、State Zip,并将其设置为要使用的地址字符串。

【问题讨论】:

  • 最后一个字符串的索引为 Count-1
  • AdressList中的最后一个字符串是AdressList.Strings[AdressList.Count - 1](可以缩写为AdressList[AdressList.Count - 1])。
  • 谢谢,我现在可以可靠地获取邮政编码了。我如何从那里倒数?所以我可以设置城市、州和邮编?
  • 在您找到城市名称为“南旧金山”或“圣安东尼奥”或州名称为“新泽西”的人之前,它会正常工作。坦率地说,虽然我看到你正在尝试做的事情,但我认为你的整个方法都是不明智的,而且只会导致长期的挫败感。 USPS 有一个网络服务,允许您提交一个地址,它会以“规范化”的形式返回一个地址,并进行更正以启动。
  • 嗯,您为您的问题添加了一个解决方案,但是那里有一个 for-loop 根本没有任何作用。还要注意使用 beginend,就目前而言,只有 LastIndex 会被分配 AddresList.Count 次...缩进不控制 Delphi/ObjectPascal 中的代码流。

标签: string delphi tstringlist


【解决方案1】:

我有点不确定你到底在找什么,因为你问 如何获取 StringList 的最后一个字符串, 然后在你问的问题结束时

有没有办法获取最后一个字符串,然后从 那里?

如果你想获取 StringList 的最后一个字符串,你可以使用

  var AddressList : TStringList;
      MyString: string;
begin
  MyString := AddressList.Last; //this...
  MyString := AddressList.Strings[AddressList.Count-1]; //...and this is essentially the same thing
end;

如果你想反向或向后循环你应该写:

for i := AddressList.Count-1 downto 0 do
  AddressList.Strings[i]; //Not sure what to do here

注意它说的是“DOWNTO”而不是“TO”。

现在,如果您想停在一个特定的字符串上,比如说邮政编码, 你需要让你的软件理解它正在阅读的内容。

哪一个分隔字符串是城市? 地址是哪一个? 对于软件来说,字符串就是字符串,它不知道,甚至不关心它在读什么。

所以我想建议你有一个城市数据库,它可以比较字符串 AddressList t,o 看看是否匹配。

您还可以在算法中实现一些逻辑。 如果您知道分隔的 AdressList 字符串的最后一个字符串始终是城市名称, 那么你知道你有城市名称可以使用。

如果您知道邮政编码和城市名称之间的所有内容都是街道地址, 然后只需复制 ZIP 和城市名称之间的所有内容并将其用作街道名称信息。

【讨论】:

  • tStringList 没有 LAST 方法。只有 tList 可以。
猜你喜欢
  • 2011-07-07
  • 2011-08-17
  • 1970-01-01
  • 2011-02-10
  • 2013-07-06
  • 2011-11-18
  • 2013-11-25
相关资源
最近更新 更多