Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.10.31;
Скачать: [xml.tar.bz2];

Вниз

парсинг имени файла   Найти похожие ветки 

 
Scot Storch   (2010-08-05 16:30) [0]

есть список имен файлов следующего формата:

"upd_-1_to_567.zip"
"upd_567_to_569.zip"
"upd_569_to_570.zip"

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


 
Юрий Зотов ©   (2010-08-05 16:33) [1]

PosEx и Copy.


 
Scot Storch   (2010-08-05 18:19) [2]

Сделал как советовали:


procedure TForm1.Button2Click(Sender: TObject);

 procedure get_upd_range(const file_name: string; out vers_from,
   vers_to: string);
 var
   Afile_name: string;
   X, Y, Z: Integer;
 begin
   Afile_name := ChangeFileExt(file_name, "");
   X := PosEx("_", Afile_name);
   if X > 0 then
   begin
     Y := PosEx("_", Afile_name, X + 1);
     if Y > 0 then
     begin
       Z := PosEx("_", Afile_name, Y + 1);
       if Z > 0 then
       begin
         vers_from := Copy(Afile_name, X + 1, Y - 1 - X);
         vers_to   := Copy(Afile_name, Z + 1, Length(Afile_name) - Z);
       end;
     end;
   end;
 end;

var
 vers_from, vers_to: string;
begin
 get_upd_range("upd_-1_to_659.zip", vers_from, vers_to);
 ShowMessage(vers_from + #13#10 + vers_to);
end;


Вроде работает как надо, ток складывается впечатление что слишком громоздко или я ошибаюсь?


 
Юрий Зотов ©   (2010-08-05 18:34) [3]

1. Это лишнее:
Afile_name := ChangeFileExt(file_name, "");
Переменная Afile_name вообще не нужна.

2. Не предусмотрены возвращаемые значения для случая, когда
X<=0 или Y<=0 или Z<=0. Я бы поднимал исключение.


 
KilkennyCat ©   (2010-08-05 18:44) [4]

если узкоспециализированно, то так быстрее:

s - входящая, а, b - выходящая
var
 i, L : integer;
 ss : boolean;
begin
 L := length(s);
 ss := false;
 for i := 0 to L do
   if s[i] in ["0".."9", "-"] then
     if ss then a := a + s[i] else b := b + s[i] else ss := true;
end;


 
KilkennyCat ©   (2010-08-05 18:45) [5]


> if ss then a := a + s[i] else b := b + s[i] else ss := true;

ошибка.
if ss then a := a + s[i] else b := b + s[i] else if a <> "" then ss := true;



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.10.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.003 c
15-1280003040
Германн
2010-07-25 00:24
2010.10.31
Эксперименты с темами


2-1281193078
pvr
2010-08-07 18:57
2010.10.31
Русская раскладка в D2010


15-1279608783
abun
2010-07-20 10:53
2010.10.31
Ложное срабатывание Trojan.Win32.StartPage


3-1246951369
Ольга
2009-07-07 11:22
2010.10.31
Нужно упростить запрос


15-1279851394
defen
2010-07-23 06:16
2010.10.31
Контроль приложения с помощью сервиса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский