Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2018, 13:32   #1
Etsareva
Форумчанин
 
Регистрация: 26.01.2018
Сообщений: 180
По умолчанию Парсинг строки

Здравствуйте! подскажите пожалуйста, как сделать парсинг такой строки, например:
Наименование M5x25-5.6-A9P ГОСТ111?
Пробовала: ExtractStrings (['x', '.', '/', '-'],['.'], PChar(selectedstand.Mark), sortlist). но знаю, что не так...
Etsareva вне форума Ответить с цитированием
Старый 02.03.2018, 13:13   #2
Etsareva
Форумчанин
 
Регистрация: 26.01.2018
Сообщений: 180
По умолчанию

Функция разбиения строки:
Код:
function NextItem(var aSrcStr: PChar): string;
var
  fIsInNumber: Boolean;
  fpStart: PChar;
const
  Digits = ['0'..'9', '-', ',', '.', 'x', '/'];
  Delimiters = [' ', #9];
begin
  Result := '';
  while (aSrcStr <> #0) and (aSrcStr^ in Delimiters) do // Пропускаем разделители
    Inc(aSrcStr);
  if aSrcStr = nil then Exit;
  fpStart := aSrcStr;
  fIsInNumber := fpStart^ in Digits;
  if fIsInNumber then
    while (aSrcStr^ <> #0) and not (aSrcStr^ in Delimiters) and (aSrcStr^ in Digits) do
      Inc(aSrcStr)
  else
    while (aSrcStr^ <> #0) and not (aSrcStr^ in Delimiters) and not (aSrcStr^ in Digits) do
      Inc(aSrcStr) ;
  SetString(Result, fpStart, aSrcStr - fpStart);
end;
которая участвует в сортировке строк:
Код:
function MyCompare(List: TStringList; Index1, Index2: Integer): Integer;
var
  f1, f2: string; // Элементы для сравнения
  fpStr1, fpStr2: pChar; // Указатели на очередной элемент исходной строки
  fVal1, fVal2: Extended; // Значения элементов в виде чисел
  fCode1, fCode2: Integer; // Коды завершения для val
begin
 Result := AnsiCompareStr(List[Index1], List[Index2]); // Сравниваем строки без разделения
  if Result = 0 then Exit; // если строки совпали
  // Теперь сравниваем поэлементно
  fpStr1 := pChar(List[Index1]);
  fpStr2 := pChar(List[Index2]);
  repeat
    f1 := NextItem(fpStr1); // Берем части строки
    f2 := NextItem(fpStr2);
    Result := AnsiCompareStr(f1, f2); // Снова сравниваем две строки без разделения
    Val(f1, fVal1, fCode1); // если это числа
    Val(f2, fVal2, fCode2);
    if (fCode1 <> 1) and (fCode2 <> 1) then begin // Это числа
      if fVal1 = fVal2 then result:=0; // Одинаковые - сравниваем дальше
      if fVal1 < fVal2 then
        Result := -1
      else
        Result := 1;
      Exit
    end;
  until (f1 = '') or (f2 = '');
end;
Сортировка только по первому элементу разбитой строки. Как сделать для всех частей? Что не так?

Последний раз редактировалось Etsareva; 02.03.2018 в 13:40.
Etsareva вне форума Ответить с цитированием
Старый 02.03.2018, 13:52   #3
Etsareva
Форумчанин
 
Регистрация: 26.01.2018
Сообщений: 180
По умолчанию

Сама разобралась)
Etsareva вне форума Ответить с цитированием
Старый 04.03.2018, 06:54   #4
XerSon
Форумчанин
 
Аватар для XerSon
 
Регистрация: 21.01.2008
Сообщений: 211
По умолчанию

Цитата:
Сообщение от Etsareva Посмотреть сообщение
Сама разобралась)
Тогда рассказывай.
XerSon вне форума Ответить с цитированием
Старый 05.03.2018, 13:54   #5
Etsareva
Форумчанин
 
Регистрация: 26.01.2018
Сообщений: 180
По умолчанию

функция сортировки работает, если между подстроками стоит разделитель - буква, например, Текст 5a25. В данном случае разделитель - буква а. Если между ними поставить разделитель - знак, например, Текст 5-25, то сортировка работает не верно. что делать?
Etsareva вне форума Ответить с цитированием
Старый 05.03.2018, 14:31   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Etsareva Посмотреть сообщение
функция сортировки работает, если между подстроками стоит разделитель - буква, например, Текст 5a25. В данном случае разделитель - буква а.
и как работает сортировка ?


Цитата:
Сообщение от Etsareva Посмотреть сообщение
Если между ними поставить разделитель - знак, например, Текст 5-25, то сортировка работает не верно.
В чём это проявляется?
Докажите на примере.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.03.2018, 14:50   #7
Etsareva
Форумчанин
 
Регистрация: 26.01.2018
Сообщений: 180
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
и как работает сортировка
Сортировка с разделителем-буквой:
Текст Р1-12-0,25x3
Текст Р1-12-0,25x6,8
Текст Р1-12-0,25x9,53
Текст Р1-12-0,25x16
Текст Р1-12-0,25x22
Текст Р1-12-0,25x36
Текст Р1-12-0,25x51
Текст Р1-12-0,25x68
Текст Р1-12-0,25x100
Текст Р1-12-0,25x105
Текст Р1-12-0,25x120
Etsareva вне форума Ответить с цитированием
Старый 05.03.2018, 14:51   #8
Etsareva
Форумчанин
 
Регистрация: 26.01.2018
Сообщений: 180
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Докажите на примере
Сортировка с разделителем-символом
Текст Р1-12-0,25-105
Текст Р1-12-0,25-36
Текст Р1-12-0,25-3
Текст Р1-12-0,25-120
Текст Р1-12-0,25-51
Текст Р1-12-0,25-100
Текст Р1-12-0,25-22
Текст Р1-12-0,25-16
Текст Р1-12-0,25-68
Текст Р1-12-0,25-6,8
Текст Р1-12-0,25-9,53

Начальный текст:
Текст Р1-12-0,25-6,8
Текст Р1-12-0,25-22
Текст Р1-12-0,25-100
Текст Р1-12-0,25-68
Текст Р1-12-0,25-16
Текст Р1-12-0,25-3
Текст Р1-12-0,25-36
Текст Р1-12-0,25-51
Текст Р1-12-0,25-120
Текст Р1-12-0,25-105
Текст Р1-12-0,25-9,53
Etsareva вне форума Ответить с цитированием
Старый 05.03.2018, 16:03   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
function NextItem(var aSrcStr: PChar): string;
var
  fIsInNumber: Boolean;
  fpStart: PChar;
const
  Digits = ['0'..'9'];
  Delimiters = [' ', #9,  '-', ',', '.', 'x', '/'];
begin
  Result := '';
  while (aSrcStr <> #0) and (aSrcStr^ in Delimiters) do // Пропускаем разделители
    Inc(aSrcStr);
  if aSrcStr = nil then Exit;
  fpStart := aSrcStr;
  fIsInNumber := fpStart^ in Digits;
  if fIsInNumber then
    while (aSrcStr^ <> #0) and not (aSrcStr^ in Delimiters) and (aSrcStr^ in Digits) do
      Inc(aSrcStr)
  else
    while (aSrcStr^ <> #0) and not (aSrcStr^ in Delimiters) and not (aSrcStr^ in Digits) do
      Inc(aSrcStr) ;
  SetString(Result, fpStart, aSrcStr - fpStart);
end;

function MyCompare(List: TStringList; Index1, Index2: Integer): Integer;
var
  f1, f2: string; // Элементы для сравнения
  fpStr1, fpStr2: pChar; // Указатели на очередной элемент исходной строки
  fVal1, fVal2: Extended; // Значения элементов в виде чисел
  fCode1, fCode2: Integer; // Коды завершения для val
begin
 Result := AnsiCompareStr(List[Index1], List[Index2]); // Сравниваем строки без разделения
  if Result = 0 then Exit; // если строки совпали
  // Теперь сравниваем поэлементно
  fpStr1 := pChar(List[Index1]);
  fpStr2 := pChar(List[Index2]);
  repeat
    f1 := NextItem(fpStr1); // Берем части строки
    f2 := NextItem(fpStr2);
    Result := AnsiCompareStr(f1, f2); // Снова сравниваем две строки без разделения
    Val(f1, fVal1, fCode1); // если это числа
    Val(f2, fVal2, fCode2);
    if (fCode1 = 0) and (fCode2 = 0) then begin // Это числа
      if fVal1 = fVal2 then result:=0
      else begin
        if fVal1 < fVal2 then
           Result := -1
        else
            Result := 1;
      end;
    end;
    if Result<>0 then Exit;
  until (f1 = '') or (f2 = '');
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.03.2018, 08:02   #10
Etsareva
Форумчанин
 
Регистрация: 26.01.2018
Сообщений: 180
По умолчанию

Serge_Bliznykov, большое Вам спасибо! поняла свою ошибку! то, что нужно!!!
Etsareva вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсинг строки OmegaBerkut Visual C++ 3 06.09.2015 12:17
Парсинг строки XaZaKa Общие вопросы по Java, Java SE, Kotlin 0 18.02.2015 17:38
Парсинг строки grafgrial Помощь студентам 14 17.01.2011 14:34
Парсинг следующей строки Fok Общие вопросы Delphi 4 12.09.2010 17:26
Парсинг строки beemoto Общие вопросы Delphi 18 12.04.2009 18:52