Как получить последнюю строку в TStringList

Я искал несколько дней, как это сделать, и это не совсем то, что мне нужно делать (или я просто не понимаю, как реализовать решение).

Что мне нужно сделать, так это проанализировать строку, которая является уличным адресом, в 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, но почтовый индекс не всегда одинаков. Есть ли способ получить последнюю строку, а затем вернуться оттуда? (Двигаясь назад, потому что, как только я получу 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 из полной адресной строки и установить его в качестве используемой адресной строки.


person Adam Elders    schedule 23.09.2014    source источник
comment
Последняя строка имеет индекс Count-1   -  person David Heffernan    schedule 24.09.2014
comment
Последняя строка в AdressList — это AdressList.Strings[AdressList.Count - 1] (которую можно сократить до AdressList[AdressList.Count - 1]).   -  person Andreas Rejbrand    schedule 24.09.2014
comment
Спасибо, теперь я могу надежно получить почтовый индекс. Как мне считать оттуда в обратном порядке? Чтобы я мог установить город, штат и почтовый индекс?   -  person Adam Elders    schedule 24.09.2014
comment
LastIndex := AddressList.Count - 1;, а затем уменьшайте (вычитайте) LastIndex на 1, пока не достигнете 0.   -  person Ken White    schedule 24.09.2014
comment
Спасибо, это именно то, что мне было нужно! Теперь я могу получить последние три строки по индексу и установить их в переменные, что мне и нужно было сделать. Поскольку я могу получить эти три, я могу взять их из полной адресной строки и установить в AddressStr. Идеально!   -  person Adam Elders    schedule 24.09.2014
comment
Это будет работать нормально, пока вы не найдете кого-то с названием города, например, Южный Сан-Франциско или Сан-Антонио, или штатом, например, Нью-Джерси. Честно говоря, хотя я и вижу, что вы пытаетесь сделать, я думаю, что весь ваш подход опрометчив и не приведет ни к чему, кроме разочарования в долгосрочной перспективе. У USPS есть веб-служба, которая позволяет вам отправить адрес, и он вернет вам его в нормализованной форме с исправлениями для загрузки.   -  person David Schwartz    schedule 24.09.2014
comment
Хм, вы добавили решение своего вопроса, но там есть цикл for, который вообще не имеет смысла. Также позаботьтесь об использовании begin и end, как сейчас, только LastIndex будет назначено количество раз AddresList.Count... Отступ не контролирует поток кода в Delphi/ObjectPascal.   -  person Stijn Sanders    schedule 24.09.2014


Ответы (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 в обратном или обратном направлении, вы должны написать:

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

Обратите внимание, что здесь написано «ВНИЗ», а не «ДО».

Теперь, если вы хотите остановиться на определенной строке, скажем, на почтовом индексе, вам нужно, чтобы ваше программное обеспечение понимало, что оно читает.

Какая из строк с разделителями является городом? Какой из них адрес? Для программы строка — это строка, она не знает и даже не заботится о том, что читает.

Поэтому я хотел бы предложить вам иметь базу данных городов, в которой можно сравнивать строки AddressList t,o и смотреть, есть ли совпадения.

Вы также можете реализовать некоторую логику в своем алгоритме. Если вы знаете, что последняя строка вашей строки AdressList с разделителями всегда является названием города, то вы знаете, что у вас есть название города, которое вы можете использовать.

Если вы знаете, что все, что находится между почтовым индексом и названием города, является адресом улицы, просто скопируйте все, что находится между почтовым индексом и названием города, и используйте это как информацию о названии улицы.

person xaid    schedule 23.09.2014
comment
tStringList не имеет метода LAST. только tList делает. - person JO SeongGng; 17.05.2015