【发布时间】: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 根本没有任何作用。还要注意使用
begin和end,就目前而言,只有 LastIndex 会被分配 AddresList.Count 次...缩进不控制 Delphi/ObjectPascal 中的代码流。
标签: string delphi tstringlist