我需要做的是将一个字符串(一个街道地址)解析成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,并将其设置为要使用的地址字符串.
因为你问,我有点不确定你正在寻找什么如何获取StringList的最后一个字符串,
然后在你问的问题的最后
Is there a way to get the last string and then go backwards from
there?
如果要获取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之间的所有内容,并将其用作街道名称信息.