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

Вниз

найти 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.045 c
2-1170879979
niil
2007-02-07 23:26
2007.02.25
Событие onMouseDown для создаваемого в ран-тайме TTabSheet


3-1164638613
Zakhar
2006-11-27 17:43
2007.02.25
Подключение через Proxy


11-1148658085
Kealon
2006-05-26 19:41
2007.02.25
FontDialog


11-1149072986
GMax
2006-05-31 14:56
2007.02.25
ScrollBox глючит


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский