我一直在寻找如何做到这一点的日子,没有什么是我需要做的(或者我不理解如何实施解决方案)。
我需要做的是将一个字符串(街道地址)解析为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,状态ZIP我可以从RawAddressStr中删除它,然后将其余部分设置为地址字符串。)
感谢。
编辑,这是我需要的代码(感谢以下评论): 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,并将其设置为要使用的地址字符串。
答案 0 :(得分:11)
我有点不确定你问的确切是什么 如何获取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”。
现在,如果你想停在一个特定的字符串,让我们说邮政编码, 你需要让你的软件理解它正在读什么。
哪个分隔字符串是城市? 哪一个是地址? 对于软件,字符串是一个字符串,它不知道,甚至不关心它正在读什么。
所以我想建议您有一个可以比较字符串的城市数据库 地址列表t,o,并查看是否匹配。
您还可以在算法中实现一些逻辑。 如果您知道分隔的AdressList字符串的最后一个字符串始终是City-name, 然后你就知道你有城市名称,你可以使用它。
如果您知道邮政编码和城市名称之间的所有内容都是街道地址, 然后只需复制ZIP和City-name之间的所有内容,并将其用作街道名称信息。