Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

найти 6 одинаковых чисел в строке [D7]


Garacio ©   (2007-02-03 07:44:00) 

Очень нужен совет:
В текстовый файл записывается отчёт о работе базы данных. Если никаких ошибок не было, то в последней строке этого файла среди многочисленных записей будет 6 одинаковых чисел. Тут могла бы помочь функция pos, но я не знаю – какие это будут числа (количество записей в БД постоянно меняется)!
Помогите решить эту головоломку!


JFK&MM_extramarital_son   (2007-02-03 12:19:00) [1]

С помощью регулярных выражений задача решается в две - три строчки.


Garacio   (2007-02-03 11:49:00) [2]

Стоп! Ещё такой вопрос:
Можно как-нибудь учесть ['0'..'9']этом поиске:
function GetWords(const S: string; L: TStrings; Delimiters: TSysCharSet): integer;
var len, idx1, idx2: integer;
begin
    Result := 0;
    if Length(S) = 0 then Exit;
    L.Clear;
    len := Length(S);
    idx2 := 1;
    repeat
      while (idx2 <= len) and (S[idx2] in Delimiters) do inc(idx2);
      idx1 := idx2;
      if (idx2 <= len) and not (S[idx2] in Delimiters) then
        while (idx2 <= len) and not(S[idx2] in Delimiters) do inc(idx2);
      if idx1 < idx2 then
         L.Add(Copy(S, idx1, idx2-idx1));
    until idx2 > len;
    Result := L.Count;
end;


Garacio   (2007-02-03 11:41:00) [3]

В Nete нашёл статью с примером:
function GetWords(const S: string; L: TStrings; Delimiters: TSysCharSet): integer;
Буду пытаться реализовать: "выцепил очередное число, сравнил с предыдущим, если равно - увеличил счетчик, если нет - счетчик сбросил"

Если что, ещё раз обращусь!


ЮЮ   (2007-02-03 10:15:00) [4]

6-ти кратный   раз =  6-ти кратный  цикл с break-ом


ЮЮ   (2007-02-03 10:14:00) [5]

Тогда к каждой строке  6-ти кратный   раз Read в строковую переменную с последующим StrToIntDef и вычислении разности с предыдущим числом.

Garacio ©   (03.02.07 09:07) [5]
Грузить в память весь лог из-за одной строки? Размер лога большой?


Virgo_Style   (2007-02-03 10:11:00) [6]

выцепил очередное число, сравнил с предыдущим, если равно - увеличил счетчик, если нет - счетчик сбросил. Сохранил очередное для последующего сравнения.
Если счетчик равен 5 - значит, уже 6 чисел равны между собой.


Garacio   (2007-02-03 10:06:00) [7]

А кроме чисел есть другая информация в этой строке?
Да, причём не только числа.
А в других строках такой же фомат информации?
Нет.


ЮЮ   (2007-02-03 09:55:00) [8]


> Возможно, это существенно: все 6 чисел стоят подряд (через
> пробел). При таком «раскладе» реально ли написать что-то
> вроде «маски» (‘# # # # # #’) для той-же функции pos?


А кроме чисел есть другая информация в этой строке? А в других строках такой же фомат информации?


Garacio   (2007-02-03 09:45:00) [9]

вычисляй разницу
Разницу между чем, если эти числа находятся где-то в строке?

Тут, действительно, либо надо разбивать строку, сравнивать полученные значения и проверять колличество (=6 ?), либо использовать маску (если это возможно)


ЮЮ   (2007-02-03 09:31:00) [10]


> какие это будут числа (количество записей в БД постоянно
> меняется)!

Если не знаешь сами числа, вычисляй разницу. Должен получить 5 нулей. :)


Garacio   (2007-02-03 09:07:00) [11]

Спасибо, PZ ! Одним вопросом меньше


PZ   (2007-02-03 08:35:00) [12]

Var
 List : TStringList;
 S : String;

 List := TStringList.Create;
 List.LoadFromFile('Text.txt');
 S := List.String[List.Count-1]);  // Последняя строка


Garacio   (2007-02-03 08:33:00) [13]

разбиваешь строку на отдельные числа и либо добавляешь новое число в массив, либо увеличиваешь счетчик. После разбора смотришь на количество полученных чисел
А ссылку на пример не могли бы оставить?


Garacio   (2007-02-03 08:13:00) [14]

Возможно, это существенно: все 6 чисел стоят подряд (через пробел). При таком «раскладе» реально ли написать что-то вроде «маски» (‘# # # # # #’) для той-же функции pos?
И остаётся ещё вопрос: как перейти в последнююстроку текстового файла?


Virgo_Style   (2007-02-03 07:54:00) [15]

Например,

type
NumAndCount = record
 Count: Integer;
 Number: Integer;
end;

var
Numbers: array of NumAndCount;

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо