Главная страница
    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.047 c
2-1170941021
Vas
2007-02-08 16:23
2007.02.25
SQL


2-1170758887
Observer
2007-02-06 13:48
2007.02.25
Assembler


15-1170269744
tesseract
2007-01-31 21:55
2007.02.25
кредитка Vs дебетка


3-1165393476
ocean
2006-12-06 11:24
2007.02.25
Подскажите структуру БД


15-1170409028
мжмж
2007-02-02 12:37
2007.02.25
Может не сюда, но все же..





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