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

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

Поиск заданного фрагмента в файле


Страницы:   1 2 3

Pretender ©   (2006-04-25 12:13:00) 

Всем здравствуйте! :)

ПОдскажите, пожалуйста, вот какую вещь: есть текстовый файл, содержащий строки вида

STR00234 6058     1   3  + 04.04.2006Бюро экспертизы проектов и смет

Необходимо организовать по ней поиск заданного значения, как: считать строку, если есть в строке '1' и '3' и '+', то увеличить значения переменных per1, per2, per3 на единицу, считать слледующую строку и т.д. Помогите разобраться, пожалуйста!

Вот что пока получилось:

procedure TForm1.Button1Click(Sender: TObject);
var
F: Textfile;
res, i, KolStr: integer;
answ : word;
mas: array of string[80];
st1: string;

begin

AssignFile(F, fname);

repeat

{$I-}

Reset(F);

{$I+}

res:=IOResult;

if res <> 0

then answ:=MessageDlg('Ошибка открытия '

+ fname + #13 + 'Повторить попытку?',mtWarning,[mbYes, mbNo],0);
until (res= 0) OR (answ = mrNo);

if res <> 0

then exit;

KolStr:=LinesCount(fname); //функция подсчёта количества строк в файле
SetLength(mas, KolStr); //создаю динамический массив
ListBox1.Items.Clear;

for i:=0 to KolStr do begin
Readln(F, St1);
mas[i]:=st1;
ListBox1.Items.Add(StrDosToWin(mas[i]));
end;

Label3.Caption := IntToStr(KolStr);

end;

function StrDosToWin(AString : string) : string;
begin
Result := AString;
OemToChar(Pointer(Result), Pointer(Result));
end;

Надо сказать, что все эти операции с массивом и листбоксом делались для проверки. Вообще же, я хотел разбить строку по элементам и каждый элемент занести в ячейку массива, а уж осуществить выборку по массиву будет проще простого. Вот только не знаю как это сделать, может будут какие предложения?


Pretender   (2006-04-25 19:47:00) [21]

А задание такое: есть у меня динамический массив ts[j], который заполняется в цикле и содержит некую последовательность элементов, например, ts['привет','50','пока']. Желаемый результат: сделать так, чтобы в этом массиве искалось строковое значение 50 и по нахождению оного счётчик к увеличивался на единицу, а затем передавался дальше в программу, ну, например, Label1.Caption:=IntToStr(к). Вот что я хочу.


Gydvin   (2006-04-25 19:37:00) [22]

Сvотрите [28], ненадо кода, только задание и желаемый результат.

зы. Из всего вышеувиденого я увидел только белиберду


Pretender   (2006-04-25 19:30:00) [23]


> какое отношение сабж имеет к файлу

Ну это тестовый файл, для проверки. Размер не задаётся, а определяется уже до цикла следующим образом:

KolStr:=LinesCount(fname); //LinesCount-функция высчитывает количество    
                                       строк в файле
SetLength(mas,KolStr); //собственно сам массив, размерность 1хKolStr,
                                вообщем одномерный


> Приведите несколько строчек из файла с выполняемыми условиями
> и не выполняемыми

Я ж привёл выше, if ts[j] = obr, на нём прога и вылетает. Это я таким образом хочу путем сравнения найти в массиве элемент, который совпадает со стринговой переменной obr='50'.


Gydvin   (2006-04-25 19:16:00) [24]

Ниасилил.

Приведите несколько строчек из файла с выполняемыми условиями и не выполняемыми (соответсвенно указав какие из них какие) и какой необходимо получить результат. А то нифига не понятно


Джо   (2006-04-25 19:15:00) [25]

Честно говоря, совсем не понял, какое отношение сабж имеет к файлу "с тремя строками - привет, 50 и пока". Ну да ладно.


> mas[i]:=st1;

Ты размер массива задаешь перед циклом?


Pretender   (2006-04-25 19:04:00) [26]

Вот теперь что я делаю: у меня есть текстовый файл с тремя строками - привет, 50 и пока. Я пытають из массива путём сравнения выявить совпадащие элементы, а затем увеличить счётчик k на единицу. Но программа "вылетает". Что не так? Видно в динамическом массиве что-то не то...

for i:=0 to KolStr do

begin

Readln(F, St1);
mas[i]:=st1;
ts[j]:=TrimRight(Copy(mas[i],1,6));

obr:='50';
if ts[j] = obr
then
k:=k+1
end;


Pretender   (2006-04-25 16:31:00) [27]

Ясно, я уже из практики понял, что да. Спасибо.


Джо   (2006-04-25 16:28:00) [28]

> [23] Pretender ©   (25.04.06 16:23)
> А если, допустим, у меня в одной строке 2 символа, а в следующей
> 1, то ножно указывать максимальное количество (в данном
> случае 2), а где один символ, то там пробел удалится?

Слушай, ну что мы на одном месте топчемся-то? Если что-то непонятно, перечитай ветку еще раз, просто добавить уже нечего, я всё сказал, в том числе и на этот вопрос отвечал, два раза.


Pretender   (2006-04-25 16:23:00) [29]

А если, допустим, у меня в одной строке 2 символа, а в следующей 1, то ножно указывать максимальное количество (в данном случае 2), а где один символ, то там пробел удалится?


Джо   (2006-04-25 16:19:00) [30]

> А количество чего (только сильно не пинай :))?

Копируемых символов.


Pretender   (2006-04-25 16:17:00) [31]


> У тебя что — справку враги украли? ;)

Эти гады решили поиздеваться - TrimRight там нет, как много чего другого :) А количество чего (только сильно не пинай :))?


Джо   (2006-04-25 16:09:00) [32]

> что в качестве 3-го рараметра

Количество. У тебя что — справку враги украли? ;)


Pretender   (2006-04-25 16:09:00) [33]

Джо, сделал ещё такой динамический массив

ts[j]:=TrimRight(Copy(mas[i],10,?));

что-то никак не допру, что в качестве 3-го рараметра указывается, Pos?


Pretender   (2006-04-25 15:57:00) [34]

Спасибо, сейчас попробую - отпишусь.


Джо   (2006-04-25 15:45:00) [35]

Сорри, TrimRight.


Джо   (2006-04-25 15:44:00) [36]

RTrim


Pretender   (2006-04-25 15:44:00) [37]


> затем обрезаешь справа пробелы

Если не трудно, то как? Я попробовал считать определённые строки, в разных местах - всё копируется. нормалёк. Я где-то в инете видел эту функцию с обрезкой, но можно здесь привести?


Джо   (2006-04-25 15:40:00) [38]

Прочитай, пожалуйста, еще раз мой пост [8]. Копируешь, начиная с определенной позиции по следующую позицию (кол-во = след.позиция - пред.позиция), затем обрезаешь справа пробелы.


Pretender   (2006-04-25 15:37:00) [39]

Так понимаешь, допустим все позиции, допустим, номера продукта, начинаются с одного значения, а длину могут иметь разную. Вот в чём дело. Т.е. получается, что длина у всех позиций не фиксирована, но начинается с определённой пизиции. Простите меня.


Джо   (2006-04-25 15:27:00) [40]

Добавлю. Перед написанием программы разбора какого-то формата, ВСЕГДА следует досконально изучить входной формат. От и до.


Страницы:   1 2 3

Наверх

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