Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.25;
Скачать: CL | DM;

Вниз

найти 6 одинаковых чисел в строке   Найти похожие ветки 

 
Garacio ©   (2007-02-03 07:44) [0]

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


 
Virgo_Style ©   (2007-02-03 07:54) [1]

Например,

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

var
Numbers: array of NumAndCount;

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


 
Garacio ©   (2007-02-03 08:13) [2]

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


 
Garacio ©   (2007-02-03 08:33) [3]

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


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

Var
 List : TStringList;
 S : String;

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


 
Garacio ©   (2007-02-03 09:07) [5]

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


 
ЮЮ ©   (2007-02-03 09:31) [6]


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

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


 
Garacio ©   (2007-02-03 09:45) [7]

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

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


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


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


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


 
Garacio ©   (2007-02-03 10:06) [9]

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


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

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


 
ЮЮ ©   (2007-02-03 10:14) [11]

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

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


 
ЮЮ ©   (2007-02-03 10:15) [12]

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


 
Garacio ©   (2007-02-03 11:41) [13]

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

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


 
Garacio ©   (2007-02-03 11:49) [14]

Стоп! Ещё такой вопрос:
Можно как-нибудь учесть ["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;


 
JFK&amp;MM_extramarital_son   (2007-02-03 12:19) [15]

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



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

Текущий архив: 2007.02.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.033 c
2-1170618502
kilonet
2007-02-04 22:48
2007.02.25
Вложенные запросы


15-1170311796
апмав
2007-02-01 09:36
2007.02.25
Просмотр событий системы


15-1170588148
SkySpeed
2007-02-04 14:22
2007.02.25
Можно ли исп-вать флэшку в качестве доп. опер. памяти в WinXP?


15-1170444543
Чайник
2007-02-02 22:29
2007.02.25
Формат файлов STL (двоичный) - кто-нибудь может дать ссылку.


2-1170334791
Tornado
2007-02-01 15:59
2007.02.25
Не закрывается DataSet